class base {
public:
virtual void fn(){}
};
class der : public base {};我知道编译器在类中提供了一个名为VPTR的成员,它在运行时由构造函数使用精确的VTABLE进行初始化。我有两个问题
1)哪个类持有VPTR。或者所有的班级都有单独的VPTR。
2)当执行语句der d;时,VPTR是如何在运行时解析的?
发布于 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()函数将被执行。
发布于 2011-09-29 16:49:21
注意:虚拟表和虚拟指针是实现细节,尽管我所知道的所有C++编译器都使用它们,但它们不是标准规定的,只有结果才是。
回答您的特定问题:具有虚方法(自己的或继承的方法)的类的每个实例或具有虚拟继承关系(某处)的类的每个实例将至少需要一个虚拟指针。
可以有几个(当涉及虚拟继承或多重继承时)。
在您的示例中,单个虚拟指针就足够了。然而,把它说成是class的一部分是没有意义的。虚拟指针是实例(对象)的一部分,存在于类规则之外,因为这些规则适用于语言,而虚拟指针是一种实现机制。
发布于 2011-09-29 16:42:47
1)哪个类持有VPTR。或者所有的班级都有单独的VPTR。
每个class object都有自己的vptr,如果class是多态的(即包含virtual函数或具有virtual继承)。在本例中,两个类都有virtual函数。
2)当执行语句der d;如何在运行时解析VPTR?
您只是声明了der的对象。但是,即使您调用了一个函数,在这种情况下,对任何函数的调用都是在编译时解析的。只有在使用指针/引用调用函数时,才会出现虚函数解析。
https://stackoverflow.com/questions/7594593
复制相似问题