Vtable和* _vptr创建时间

时间:2014-08-23 05:31:28

标签: c++

Vtable和* _vptr由编译器在编译时创建。 编译器何时创建它,在执行构造函数代码之前或之后,或者在为类的对象分配内存之前或之后?

我想清楚地知道为什么虚拟构造函数不可能。

1 个答案:

答案 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();      }