为什么构造函数不能声明为虚函数?
1.创建一个对象必须明确指出它的类型,否则无法创建,一个对象创建成功编译器获得它的实际类型,然后去调用对应的函数,而如果构造函数声明为虚函数,会形成一个死锁,虚函数是在运行才能确定确定其调用哪一个类型的函数,而具体哪一个类型是编译器通过对象的类型去确定的,但是此时对象还未创建也就没法知道其真实类型。
class A{
public:
virtual A(){};
};
虚函数必须通过具体的实例对象决定调用对应的函数,当将构造函数定义为虚函数时,此时无法生成具体的实例对象(因为不知道调用哪一个构造函数)
无法生成具体的实例对象就无法调用虚函数,无法调用虚函数就无法生成具体的对象,因此陷入死锁
2.虚函数对应一张虚函数表,这个虚函数表是存储在对象的内存空间的,如果构造函数是虚函数就需要通过虚函数表来调用,可是对象还没有实例化,也就是内存空间还没有,找不到虚函数表,所以构造函数是不能声明为虚函数的。