首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多态虚拟表

多态虚拟表
EN

Stack Overflow用户
提问于 2016-04-10 19:56:16
回答 1查看 1.5K关注 0票数 2

我读过很多帖子,每个人都说,虚拟表是每个类,而不是每个对象,对象只有指向共享vtable的_vtpr指针。但请考虑这个例子:

代码语言:javascript
复制
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;时执行哪些操作?有人能为这些操作编写伪代码吗?

EN

回答 1

Stack Overflow用户

发布于 2016-04-10 20:04:34

我希望下面的例子会有所帮助。派生类只复制基类的虚拟表,但它们可能修改适当的条目。红色部分显示给定类修改了v表中的条目。因此,在创建派生类的实例时,将考虑修改后的表(特定于该类)。

这取决于编译器如何处理基类的欺骗性(如果基类有大量函数--派生会有整个虚拟函数表的副本,并会修改条目吗?)IMO,编译器将简单地复制每个派生类的整个表,以保持简单。然后寻找合适的调用方法就变得简单了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36534839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档