我決定了解vtable是如何構建的,所以我打開調試器,發現了一些奇怪的東西。節點ptr包含幾個vptr。我一直認爲每個對象只有一個vptr。有人能向我解釋這裏發生了什麼事嗎? (我的意思是,當基類指針指向派生類對象)虛擬表格指針
#include <iostream>
using namespace std;
class Base
{
int base;
public:
virtual void say()
{
cout << "Hello" << endl;
}
virtual void no()
{
cout << "No" << endl;
}
};
class Base2
{
public:
virtual void lol()
{
cout << "lol" << endl;
}
};
class Derv:public Base,public Base2
{
public:
void say()
{
cout << "yep" << endl;
}
};
int main()
{
Base* ptr = new Derv();
ptr->say();
ptr = new Base();
ptr->say();
}
http://s018.radikal.ru/i504/1405/1e/38832e978dd5.jpg
我不明白你的意思是「節點ptr包含幾個vptr」。你能準確地展示你看到你想要解釋的是什麼嗎? –
「Base」的另一個vtable和「Base2」的另一個vtable。編譯器可以選擇任何方法來實現虛擬表。我不認爲vtables的結構在所有平臺上都可以預期相同。 –
[鏈接](http://s018.radikal.ru/i504/1405/1e/38832e978dd5.jpg) – GamovCoder