首页
学习
活动
专区
圈层
工具
发布

vptr解析
EN

Stack Overflow用户
提问于 2011-09-29 16:38:32
回答 3查看 549关注 0票数 2
代码语言:javascript
复制
class base {
public:
    virtual void fn(){}
};

class der : public base {};

我知道编译器在类中提供了一个名为VPTR的成员,它在运行时由构造函数使用精确的VTABLE进行初始化。我有两个问题

1)哪个类持有VPTR。或者所有的班级都有单独的VPTR。

2)当执行语句der d;时,VPTR是如何在运行时解析的?

EN

回答 3

Stack Overflow用户

发布于 2011-09-29 18:11:15

vtable是为包含虚函数的类创建的,对于从it.It派生的类,在您的程序中,将为base类创建vtable,这些类的der class.Each将包含虚函数的地址void fn().Now注意,der类不包含void fn()的定义,因此它的vtable包含base类的void fn() function.Thus的地址如果您像d.fn();这样进行调用,base类的void fn()函数将被执行。

票数 3
EN

Stack Overflow用户

发布于 2011-09-29 16:49:21

注意:虚拟表和虚拟指针是实现细节,尽管我所知道的所有C++编译器都使用它们,但它们不是标准规定的,只有结果才是。

回答您的特定问题:具有虚方法(自己的或继承的方法)的类的每个实例或具有虚拟继承关系(某处)的类的每个实例将至少需要一个虚拟指针。

可以有几个(当涉及虚拟继承或多重继承时)。

在您的示例中,单个虚拟指针就足够了。然而,把它说成是class的一部分是没有意义的。虚拟指针是实例(对象)的一部分,存在于类规则之外,因为这些规则适用于语言,而虚拟指针是一种实现机制。

票数 2
EN

Stack Overflow用户

发布于 2011-09-29 16:42:47

1)哪个类持有VPTR。或者所有的班级都有单独的VPTR。

每个class object都有自己的vptr,如果class是多态的(即包含virtual函数或具有virtual继承)。在本例中,两个类都有virtual函数。

2)当执行语句der d;如何在运行时解析VPTR?

您只是声明了der的对象。但是,即使您调用了一个函数,在这种情况下,对任何函数的调用都是在编译时解析的。只有在使用指针/引用调用函数时,才会出现虚函数解析。

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

https://stackoverflow.com/questions/7594593

复制
相关文章

相似问题

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