繁体   English   中英

解决vptr

[英]Resolving of vptr

class base {
public:
    virtual void fn(){}
};

class der : public base {};

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

1)哪个班级拥有VPTR。 或所有班级都有单独的VPTR。

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

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

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

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

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

您的示例中,单个虚拟指针就足够了。 但是,将其称为class一部分是没有意义的。 虚拟指针是实例(对象)的一部分,并且不属于类规则,因为它们适用于语言,并且虚拟指针是一种实现机制。

1)哪个班级拥有VPTR。 或所有班级都有单独的VPTR。

如果class是多态的(即包含virtual函数或具有virtual继承),则每个class 对象都有其自己的vptr 。在这种情况下,两个类都具有virtual函数。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM