解决vptr

时间:2011-09-29 08:38:32

标签: c++ inheritance polymorphism vptr

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

class der : public base {};

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

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

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

3 个答案:

答案 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的对象。但即使你调用一个函数,在这种情况下,对任何函数的调用都在编译时解决。仅当使用指针/引用调用函数时,虚函数分辨率才会出现。