我试图模拟vptr/vtable的概念。我有3个就以下几个问题:虚拟表格指针和虚拟表格模拟
我还没有该类FOO,这应该是罚款,可以在里面主要可见定义的任何构造函数(Foo *ptr= new FOO
是OK)。 但是,当我在FooVtable :: bar()内部的同一堆上创建对象时,它抱怨找不到适当的默认构造函数。为什么?
2.我看到的vptr指向某个地址(即使没有new FooVTable
对于vptr的做,我想构造函数在默认情况下做到的。是它预期?),FooVtable::bar
获取调用但COUT犯规打印声明。为什么?
内callsomeFun(),我打电话foo->vptr->bar
。我想在这里实现的是foo->vptr-的vptr->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 *'指针作为第一个参数。 –