[英]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.