C++中为什么构造函数不能是虚函数,析构函数是虚函数

如题所述

构造函数不能声明为虚函数的原因是:
所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错.

析构函数在某些情况下必须为虚函数(比如你想让你类能够被继承,那么这个类的析构函数最好是虚的,继承一个析构函数不是虚的类是有风险的),值得补充的是,当基类的函数是虚函数,子类的重载的函数也是虚的,即使不加virtual关键字也是虚的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-05-31
调用构造函数时,虚表才建立,构造函数是虚函数,谁建立虚表啊....
析构函数之所以搞成虚函数,因为你可能采用基类指针动态申请派生类对象,
用完用delete吧,这时 将才产生一个问题,基类指针指向何种对象?如果是虚函数,根据多态,
直接delete,会根据对象,调用析构,即可完美解决,否则需要根据类型转换,很是麻烦啊...
所以,总结一下:
1,构造函数一定不要是虚函数,
2,一个类要被继承派生时,析构函数定义成虚函数是极佳选择。本回答被网友采纳
第2个回答  2012-09-19
构造函数的作用是创建一个对象,对象的类型是确定的,所以对于一个构造函数来说,他的类型是确定的,做成虚函数就没什么意义了,如果是虚函数的话,编译器也会出于优化考虑将其作为一个普通函数来处理。
析构函数做成虚函数是考虑到:如果将一个派生类对象的地址赋给基类指针,然后又对这个基类指针delete,会出现什么情况呢?
如果析构函数不是虚函数的话,就只会调用基类的析构函数,这样派生类的析构函数就没没有被调用,导致部分内存没有被正确清除。
如果析构函数是虚函数的话,就会首先调用派生类的析构函数,然后调用基类的析构函数,最后所有的内存都被正确清除。

class A {
//......
};
class B : public A {
//....
};
void use(A * p) {
//....
delete p;
}

int main() {
use(new B());//哎呀!麻烦,B的析构函数没有调用
}

而:
class A {
virtual ~A() {}
};

class B : public A {
~B() {}
};

void use(A *p) {
delete p;
}
int main() {
use(new B());
}
相似回答