【发布时间】:2015-10-07 02:53:45
【问题描述】:
我正在尝试模拟 vptr/vtable 概念。关于以下问题,我有 3 个问题:
1. 我没有为类 FOO 定义任何构造函数,这应该没问题,可以在 main 中看到(Foo *ptr= new FOO 可以)。
但是当我在堆上为 FooVtable::bar() 中的相同对象创建对象时,它抱怨找不到合适的默认构造函数。为什么?
2. 我看到 vptr 指向某个地址(尽管没有为 vptr 完成 new FooVTable,但我猜想 ctor 默认会这样做。这是预期的吗?),FooVtable::bar被调用但 cout 不打印该语句。为什么?
3. 在 callsomeFun() 内部,我正在调用 foo->vptr->bar 。我在这里想要实现的是 foo->vptr->bar 的 vptr->bar 部分实际上应该调用指向成员函数的指针Foo::bar() ,我想这不是直接可能的,因此我在其中声明了void bar(Foo* foo),我想通过ptr调用Foo:bar。我是否正确地接近它,还是有更好的方法来解决这个问题?
class Foo;
struct FooVtable {
void bar(Foo* foo)
{
//Foo *ptr = new Foo; //Why does this throw error as No Default constructor?
cout<"FooVTable : bar"; //Doesnt get printed even though gets called
}
};
struct Foo {
FooVtable* vptr;
void bar(Foo *foo)
{
cout<<"Foo : bar";
}
};
int callSomeFun(Foo* foo) {
foo->vptr->bar(foo);
return 0;
}
int main()
{
Foo *ptr=new Foo;
callSomeFun(ptr);
return 0;
}
【问题讨论】:
-
真正的 vtable 不包含实际函数,而是指向函数的指针。而这些函数会将
this*指针作为第一个参数。
标签: c++