考慮下面的代碼。在C++中如何確定虛擬表中的索引?
#include<iostream>
using namespace std;
class Base
{
public:
virtual void function1() {cout<<"Base:function1()\n";};
virtual void function2() {cout<<"Base:function1()\n";};
};
class D1: public Base
{
public:
virtual void function1() {cout<<"D1:function1()\n";};
virtual void function2() {cout<<"D1:function2()\n";};
};
int main()
{
Base *ptr= new D1;
ptr->function1();
ptr->function2();
return 0;
}
ptr將指向D1 obj。因此無論何時我調用ptr-> function1(),函數地址都是從D1類的虛擬表中提取的。它同樣適用於ptr-> function2()。在這種情況下,vtable [0]將具有指向function1()的函數指針,vtable [1]將具有指向function2()的函數指針。
我的問題是如何函數調用vtable索引映射發生?
ptr-> function1()& ptr-> function2()分別索引到vtable [0] & vtable [1]?
請參閱:http://stackoverflow.com/questions/70682/what-is-the-vtable-layout-and-vtable-pointer-location-in-c-objects-in-gcc-3-x – vcp
編譯器在某些時候決定並注意到其內部的數據結構,就像其他的一樣。通常,算法只應該依賴於類的定義,因此在每個TU中,除了每個TU外,它不需要任何東西來產生相同的vtable。 –
編譯過程中發生這種情況。編譯器知道這些函數是虛擬的以及如何調用它們。 – molbdnilo