2015-10-07 99 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?

這真的取決於你想如何真正落實多少「模擬」和你希望通過它來實現的。