C++ Vtable和*vptr创建时间
Vtable和*vptr由编译器在编译时创建。 编译器什么时候创建它,在构造函数代码执行之前或之后,或者在为类的对象分配内存之前或之后C++ Vtable和*vptr创建时间,c++,C++,Vtable和*vptr由编译器在编译时创建。 编译器什么时候创建它,在构造函数代码执行之前或之后,或者在为类的对象分配内存之前或之后 我想弄清楚为什么不可能使用虚拟构造函数。虚拟构造函数的不存在与vtable/vptr的创建过程无关。事实上,vtable概念本身就是一个实现细节(如何/如果使用vtable是实现定义的) 现在,虚拟构造函数会做什么?当动态类型不同于静态类型时,虚拟成员函数的本质是提供动态多态性 但是构造函数知道对象的静态类型,并且它必须是实际(这个)对象的类型:这里不涉及动态行
我想弄清楚为什么不可能使用虚拟构造函数。虚拟构造函数的不存在与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。您需要查看编译器的文档。一个虚拟构造函数到底会做什么?构造函数必须按照严格的顺序执行(例如,先是基类构造函数,然后是子类构造函数,然后是子类构造函数,等等,直到最派生的类),因为每个子类构造函数都依赖于其超类对象已经正确初始化的事实,也就是说,它的超类的构造函数已经完成了执行。如果一个(假设的)虚拟构造函数是可能的,它可能会打破这种顺序,并最终尝试对尚未构造的成员变量进行操作。