我读过很多帖子,每个人都说,虚拟表是每个类,而不是每个对象,对象只有指向共享vtable的_vtpr指针。但请考虑这个例子:
class Base
{
public:
virtual void func1(void) {}
virtual void func2(void) {}
private:
int dummy;
};
class Der1 : public Base
{
public:
virtual void func1(void) {}
private:
int dummy;
};
class Der2 : public Base
{
public:
virtual void func2(void) {}
private:
int dummy;
};
int main(void)
{
Base * obj1 = new Der1;
Base * obj2 = new Der2;
}obj1和obj2是否与唯一的基类vtable有关?我想答案是否定的,但你能解释一下吗?如果这两个对象都与同一个vtable相关,那么如何确定要调用哪些方法?例如,obj2 1->func1 1引用与obj2 2->func1 1不同。
更新:
执行Base * obj1 = new Der1;时执行哪些操作?有人能为这些操作编写伪代码吗?
发布于 2016-04-10 20:04:34
我希望下面的例子会有所帮助。派生类只复制基类的虚拟表,但它们可能修改适当的条目。红色部分显示给定类修改了v表中的条目。因此,在创建派生类的实例时,将考虑修改后的表(特定于该类)。
这取决于编译器如何处理基类的欺骗性(如果基类有大量函数--派生会有整个虚拟函数表的副本,并会修改条目吗?)IMO,编译器将简单地复制每个派生类的整个表,以保持简单。然后寻找合适的调用方法就变得简单了。

https://stackoverflow.com/questions/36534839
复制相似问题