纯虚函数位于C ++中的哪个位置?

时间:2010-03-31 02:33:05

标签: c++ vtable

哪个虚拟表将是纯虚函数?在基类或派生类中?

例如,每个类中的虚拟表是什么样的?

class Base {

  virtual void f() =0;
  virtual void g();
}


class Derived: public Base{

  virtual void f();
  virtual void g();

}

4 个答案:

答案 0 :(得分:16)

g++ -fdump-class-hierarchy layout.cpp生成文件layout.cpp.classlayout.cpp.class的内容将显示以下内容:

Vtable for Base
Base::_ZTV4Base: 4u entries
0     (int (*)(...))0
8     (int (*)(...))(& _ZTI4Base)
16    __cxa_pure_virtual
24    Base::g

Class Base
   size=8 align=8
   base size=8 base align=8
Base (0x7ff893479af0) 0 nearly-empty
    vptr=((& Base::_ZTV4Base) + 16u)

Vtable for Derived
Derived::_ZTV7Derived: 4u entries
0     (int (*)(...))0
8     (int (*)(...))(& _ZTI7Derived)
16    Derived::f
24    Derived::g

Class Derived
   size=8 align=8
   base size=8 base align=8
Derived (0x7ff893479d90) 0 nearly-empty
    vptr=((& Derived::_ZTV7Derived) + 16u)
  Base (0x7ff893479e00) 0 nearly-empty
      primary-for Derived (0x7ff893479d90)

删除f的'纯度'会将第五行更改为:

16    Base::f

答案 1 :(得分:2)

每个班级都有自己的vtable。 fBase的条目为NULLDerived中的条目将是指向已实施方法的代码的指针。

答案 2 :(得分:1)

vtable条目将在基类中。

为什么呢?因为您可以拥有一个基类指针类型,该类型包含派生类型对象的地址,并仍然在基类型的指针变量上调用该方法。

纯虚拟只是告诉编译器派生类型必须提供自己的实现,并且它们不能依赖基类的实现(如果甚至在基类中指定了一个)

答案 3 :(得分:1)

实际上两者都是。基类vtable将有一个用于纯虚函数的插槽,指向可能会中止程序的pure_virtual_function_called()存根,而派生类vtable将具有指向实际实现的指针。