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

 我来答
大幅度的风
2012-09-14 · TA获得超过986个赞
知道小有建树答主
回答量:571
采纳率:14%
帮助的人:158万
展开全部
构造函数不能声明为虚函数的原因是:
所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错.

析构函数在某些情况下必须为虚函数(比如你想让你类能够被继承,那么这个类的析构函数最好是虚的,继承一个析构函数不是虚的类是有风险的),值得补充的是,当基类的函数是虚函数,子类的重载的函数也是虚的,即使不加virtual关键字也是虚的。
HongZe081100
推荐于2016-05-31 · TA获得超过580个赞
知道小有建树答主
回答量:436
采纳率:0%
帮助的人:432万
展开全部
调用构造函数时,虚表才建立,构造函数是虚函数,谁建立虚表啊....
析构函数之所以搞成虚函数,因为你可能采用基类指针动态申请派生类对象,
用完用delete吧,这时 将才产生一个问题,基类指针指向何种对象?如果是虚函数,根据多态,
直接delete,会根据对象,调用析构,即可完美解决,否则需要根据类型转换,很是麻烦啊...
所以,总结一下:
1,构造函数一定不要是虚函数,
2,一个类要被继承派生时,析构函数定义成虚函数是极佳选择。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2012-09-19 · TA获得超过3954个赞
知道大有可为答主
回答量:1636
采纳率:77%
帮助的人:1213万
展开全部
构造函数的作用是创建一个对象,对象的类型是确定的,所以对于一个构造函数来说,他的类型是确定的,做成虚函数就没什么意义了,如果是虚函数的话,编译器也会出于优化考虑将其作为一个普通函数来处理。
析构函数做成虚函数是考虑到:如果将一个派生类对象的地址赋给基类指针,然后又对这个基类指针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());
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式