2015-10-07 98 views
0

我试图模拟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; 
} 
+0

一个真正的vtable不包含实际的函数,而是指向函数的指针。而这些函数会将'this *'指针作为第一个参数。 –

回答

1
  1. when i create the object on heap for the same inside FooVtable::bar() , it complains about no appropriate default constructor found. Why?

这对在那里你想使用一个类之前已经完全申报情况较差的错误消息。在不同的编译器中,消息可能更像“错误:使用不完整类型的类Foo'”。

解决此问题的一种方法是将完整的struct Foo填充到FooVtable以上,然后使用FooVtable的前向声明而不是Foo

  1. I see that vptr points to some address(even though there is no new FooVTable done for vptr,i guess ctor by default does it. is it expected?), FooVtable::bar is getting called but cout doesnt print the statement. Why?

vptr未初始化。像指针这样的原始类型不会通过new初始化为任何类型的默认值。所以无论在哪里都有垃圾。预计会有这么多。

无论通过带有垃圾值的指针调用函数后发生的情况都是未定义的行为。所以任何事情都可能发生,并且不会有保证的解释。

但是在这种情况下还有另外一个问题:你犯了一个错字。 cout<"FooVTable : bar";有一个单一的<,因此会做一个奇怪而无用的比较,而不是输出任何东西。

  1. foo->vptr->bar should actually call a pointer to member function Foo::bar() , which i guess isnt directly possible

指向成员函数是可能的。到目前为止,您可能会在您创建的情况下使用它。然而,一旦你开始将继承带入场景中(这是虚拟函数最终有用的地方),它可能会变得有趣,试图在不同类型之间进行这项工作。 (我很少使用成员函数指针,所以我不能随便说。)

Am i approaching it right, or is there a better way to approach this?

这真的取决于你想如何真正落实多少“模拟”和你希望通过它来实现的。