用C ++编写的vptr和vtable的概念

时间:2016-10-05 08:29:38

标签: c++ default-constructor vtable vptr

为什么只有默认构造函数才能创建vptr(虚拟表指针)和vtable(虚拟表)?为什么参数构造函数不能

2 个答案:

答案 0 :(得分:5)

首先,v ++和vptrs未由C ++语言标准指定。

他们是一个实现细节,尽管据我所知,所有现存的C ++实现都使用该技术来实现虚函数调度。

通过这样的实现,具有虚拟成员函数的类的所有构造函数必须建立对象的vptr。没有它,事情就无法发挥作用。所以...

  

为什么参数构造函数无法

......只是一个不正确的假设。

答案 1 :(得分:0)

假设实现使用vtable(一个非常常见的实现选择,如#34; Cheers和hth-Alf"所示),vtable和调用构造函数的创建/填充是不同的操作。

但是,给定(非抽象)类的所有实例 - 一旦完全构造 - 将具有相同的vtable集合(从多个基础继承的类可能具有多个vtable)。肯定不会有不同的vtable,具体取决于对象的构造方式(例如,传递给构造函数的参数,调用的构造函数等)。