Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Vtable和*vptr创建时间_C++ - Fatal编程技术网

C++ Vtable和*vptr创建时间

C++ Vtable和*vptr创建时间,c++,C++,Vtable和*vptr由编译器在编译时创建。 编译器什么时候创建它,在构造函数代码执行之前或之后,或者在为类的对象分配内存之前或之后 我想弄清楚为什么不可能使用虚拟构造函数。虚拟构造函数的不存在与vtable/vptr的创建过程无关。事实上,vtable概念本身就是一个实现细节(如何/如果使用vtable是实现定义的) 现在,虚拟构造函数会做什么?当动态类型不同于静态类型时,虚拟成员函数的本质是提供动态多态性 但是构造函数知道对象的静态类型,并且它必须是实际(这个)对象的类型:这里不涉及动态行

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


我想弄清楚为什么不可能使用虚拟构造函数。

虚拟构造函数的不存在与vtable/vptr的创建过程无关。事实上,vtable概念本身就是一个实现细节(如何/如果使用vtable是实现定义的)

现在,虚拟构造函数会做什么?当动态类型不同于静态类型时,虚拟成员函数的本质是提供动态多态性

但是构造函数知道对象的静态类型,并且它必须是实际(这个)对象的类型:这里不涉及动态行为


注意:

有一些设计模式,例如,允许您动态克隆对象,如果这是您真正想要的:

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

虚拟构造函数的不存在与vtable/vptr的创建过程无关。事实上,vtable概念本身就是一个实现细节(如何/如果使用vtable是实现定义的)

现在,虚拟构造函数会做什么?当动态类型不同于静态类型时,虚拟成员函数的本质是提供动态多态性

但是构造函数知道对象的静态类型,并且它必须是实际(这个)对象的类型:这里不涉及动态行为


注意:

有一些设计模式,例如,允许您动态克隆对象,如果这是您真正想要的:

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

它是实现定义的。编译器不必使用vtable。您需要查看编译器的文档。一个虚拟构造函数到底会做什么?构造函数必须按照严格的顺序执行(例如,先是基类构造函数,然后是子类构造函数,然后是子类构造函数,等等,直到最派生的类),因为每个子类构造函数都依赖于其超类对象已经正确初始化的事实,也就是说,它的超类的构造函数已经完成了执行。如果一个(假设的)虚拟构造函数是可能的,它很可能会打破这种顺序,并最终尝试对尚未构造的成员变量进行操作。它是实现定义的。编译器不必使用vtable。您需要查看编译器的文档。一个虚拟构造函数到底会做什么?构造函数必须按照严格的顺序执行(例如,先是基类构造函数,然后是子类构造函数,然后是子类构造函数,等等,直到最派生的类),因为每个子类构造函数都依赖于其超类对象已经正确初始化的事实,也就是说,它的超类的构造函数已经完成了执行。如果一个(假设的)虚拟构造函数是可能的,它可能会打破这种顺序,并最终尝试对尚未构造的成员变量进行操作。