class base {
public:
virtual void fn(){}
};
class der : public base {};
我知道编译器在类中提供了一个成员调用VPTR,它在运行时由构造函数初始化为精确的VTABLE。我有两个问题
1)哪个班级持有VPTR。或者所有班级都有单独的VPTR。
2)执行语句der d;
时如何在运行时解析VPTR?
答案 0 :(得分:2)
注意:虚拟表和虚拟指针是实现细节,尽管我所知道的所有C ++编译器都使用它们,但标准并未规定它们,只有结果是。
回答您的具体问题:具有虚拟方法(自己的或继承的)或具有(某处)虚拟继承关系的类的每个实例都需要至少一个虚拟指针。
可能有几个(当涉及虚拟继承或多继承时)。
在你的示例中,单个虚拟指针就足够了。然而,将它视为class
的一部分是没有意义的。虚拟指针是实例(对象)的一部分,并且存在于类规则之外,因为它们适用于该语言,而虚拟指针是一种实现机制。
答案 1 :(得分:2)
vtable
是为包含虚函数的类和从它派生的类创建的。这意味着在您的程序vtable
中将为base
类和{{1}创建} class。这些der
中的每一个都包含虚函数vtables
的地址。现在注意void fn()
类不包含der
的定义,因此它void fn()
1}}包含vtable
类的base
函数的地址。因此,如果您进行void fn()
之类的调用,d.fn();
类的void fn()
函数将被执行。
答案 2 :(得分:0)
1)哪个班级持有VPTR。或者所有班级都有单独的VPTR。
如果class
是多态的(即包含vptr
函数或class
,则每个virtual
对象都有自己的virtual
继承。)在这种情况下,两个类都有virtual
函数。
2)执行语句 der d; 如何在运行时解析VPTR?
您只是声明der
的对象。但即使你调用一个函数,在这种情况下,对任何函数的调用都在编译时解决。仅当使用指针/引用调用函数时,虚函数分辨率才会出现。