我試圖模擬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 *'指針作爲第一個參數。 –