Vtable和* _vptr由编译器在编译时创建。 编译器何时创建它,在执行构造函数代码之前或之后,或者在为类的对象分配内存之前或之后?
我想清楚地知道为什么虚拟构造函数不可能。
答案 0 :(得分:4)
虚构造函数的不存在与vtable / vptr的创建过程无关。实际上,vtable概念本身就是一个实现细节(如何/如果使用vtable是实现定义的)
现在,虚构造函数会做什么?当动态类型与静态类型不同时,虚拟成员函数的本质是提供动态多态性。
但构造函数知道对象的静态类型,它必须是实际(this)对象的类型:此处不涉及动态行为。
注意:强>
有一些设计模式,例如Virtual Constructor pattern,可以让你动态克隆一个对象,如果这是你真正想要的东西:
class Shape {
public:
virtual ~Shape() { } // A virtual destructor
virtual void draw() = 0; // A pure virtual function
virtual void move() = 0;
...
virtual Shape* clone() const = 0; // Uses the copy constructor
virtual Shape* create() const = 0; // Uses the default constructor
};
class Circle : public Shape {
public:
Circle* clone() const; // Covariant Return Types; see below
Circle* create() const; // Covariant Return Types; see below
...
};
Circle* Circle::clone() const { return new Circle(*this); }
Circle* Circle::create() const { return new Circle(); }