我决定了解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