构造函数、析构函数是否要声明为虚函数的问题

构造函数、析构函数是否要声明为虚函数的问题,第1张

构造函数、析构函数是否要声明为虚函数的问题,第2张

构造函数不能声明为虚函数的原因是:
解释1:所谓虚函数,是指在多态条件下只执行一个。从继承的概念来看,总是需要先构造父类对象,才能成为子类对象。如果构造函数被设置为虚函数,还有一个原因就是当你构造父类的构造函数时,为了防止出错,你必须显示调用构造函数。试想一下,如果你不小心在一个子类中重写了一个与父类的构造函数相同的函数,那么你的父类的构造函数就会被覆盖,也就是父类的构造无法完成。会有一个错误。
解释二:虚函数的主要含义是被派生类继承,产生多态性。在派生类的构造函数中,编译器将添加代码来构造基类。如果基类的构造函数使用参数,那么派生类必须在其构造函数的初始化列表中给基类参数,这就是原因。
将析构函数设置为虚函数的作用:
解释:在一个类的继承中,如果有一个基类指针指向派生类,当基类指针用于删除时,如果没有定义为虚函数,那么派生类派生的部分是不能析构的。
例:
# include " STD afx . h "
# include " stdio . h "/br/]A类
{
Public:
A();
virtual ~ A();
};
A::A()
{
}
A::~ A()
{
printf(" Delete class AP \ n ");
}
B类:public A
{
public:
B();
~ B();
};
B::B()
{
}
B::~ B()
{
printf(" Delete class BP \ n ");
}
int main(int argc,char * argv[])
{
a* B = new B;
删除b;
返回0;
}
输出结果是:删除B类
删除A类
如果删除A的虚,就变成删除A类
。所以析构函数没有声明为虚函数,容易导致内存泄漏。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 构造函数、析构函数是否要声明为虚函数的问题

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情