C++中vptr和vtable的概念

Concept of vptr and vtable in C++

为什么只有默认构造函数只能创建vptr(Virtual Table Pointer)和vtable(Virtual Table)?为什么参数构造函数不能

首先,vtables 和 vptrs 没有被 C++ 语言标准指定。

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

有了这样的实现,所有 具有虚拟成员函数的 class 构造函数,必然会建立对象的 vptr。没有它,事情就无法进行。所以……

Why parameter constructor not able to

...只是一个错误的假设。

假设实现使用 vtable(一种非常常见的实现选择,如 "Cheers and hth - Alf" 所述),vtable 的 creation/population 和调用构造函数是不同的操作。

但是,给定(非抽象)class 的所有实例——一旦完全构建——将具有相同的 vtable 集(从多个基础继承的 class 可能有超过一个虚表)。根据对象的构造方式(例如,将哪些参数传递给构造函数,调用哪个构造函数等),肯定不会有不同的 vtable。