返回首页

如果在派生类中,我不会覆盖一个虚函数在基类中定义。然后多少虚拟表将被创建,如果我创建的基类和派生类的对象?


base

{

   virtual xyz()

   {

   }

};

 

derived: public base

{

 

};

 

main()

{

   base bobj;

   derived dobj;

 

}


这里将创建派生类的虚表呢?

回答

评论会员:游客 时间:2012/02/06
వేంకటనారాయvenkatmakam):?在这种情况下,派生类的虚表将包含基地::xyz的函数指针Two.But
Stefan_Lang:我怀疑在这种情况下,编译器会聪明足够的检测,没有*室颤阈值实际需要:

基类*永远需要的,因为它总是会使用它自己的方法。*
2。派生类不覆盖任何虚函数,所以并不需要一个室颤阈值。*(见下文)

如果添加在派生重写,才派生类室颤阈值,就必须添加。此外,这个类创建任何实例将需要额外的内存为室颤阈值的指针(话又说回来,如果你使用的运行时类型信息或在托管C程序,有可能已经是一个类的相关信息的指针,所以你可能不会注意到内存消耗的区别)

* P.S. - 修正:
派生类必须有一个虚函数表!原因是,如果在另一个编译单元,甚至是另一个库,类derived2是从派生派生和覆盖的xyz()实际上,然后通过一个指针类型派生*访问对象的任何代码在运行时将不得不决定什么类这个对象真的是,无论是在基础版本,或其他有被称为。

那么,什么埃米利奥发布是正确的。我不知道甚至共享一个vtable的可能性,但它是有道理的
评论会员:游客 时间:2012/02/06
C编译器实现动态方法调度是...依赖于实现,甚至可以不上的V-表的概念的基础。在C规格说的是:*所有方法都继承*每一种方法,可以覆盖*覆盖一个虚方法是虚拟*结果隐含或间接调用一个虚拟的方法总是在通话中最派生的重写。编译器如何做一个C程序员,这是不是一个问题,但对于编译器的开发。使用的V-表仅仅是一个非常普遍的技术。如果被采纳,这在你的情况,因为你的派生有一个虚拟的方法(它继承了从基地),它必须有一个vtable指针(就像基地)。请注意该对象没有虚函数表,但只是一个指针,指向一个相同类型的所有对象共享的vtable。但因为你派生添加什么基地,编译器可以优化决策都共享一个相同的vtable,因为没有改写为XYZ定义,进一步的编译器的优化可能使该函数在非虚拟的。在任何情况下,你不应该关心。是否需要一个vtable,编译器将生成所有类的实例,将有一个vtable指针