构造函数与析构函数以及virtual

2018-02-03 10:19:10来源:网络收集作者:程序诗人人点击

分享

构造函数一定不可以为虚函数。


A->B      //A为基类,派生了B


A的析构函数为~A();


B的析构函数为~B();


现在定义了一个B对象。


若A的析构函数不为virtual,则B析构时,调用的是基类A的析构函数~A(),尽管B显式定义了自己的析构函数~B()。


若A的析构函数为virtual,则B析构时,先调用B的析构函数~B(),再调用基类A的析构函数~A()。


 


其他非构造与析构的函数,都可以声明为virtual。但若在类的构造与析构函数中调用这些虚函数,是不会呈现出多态的。


比如:


class A
{
A();
virtual ~A(){clear();}
virtual void clear();
}
class B : public A
{
B();
virtual ~B(){clear();}
virtual void clear();
}
main()
{
Bb;
A*pA = (A*)(&b);
deleatepA;
}


上面的代码,将B的对象b赋给基类A的指针pA,然后删掉pA。由于析构函数前有virtual关键字,这样会先调用B的析构函数再调用A的析构函数。


但是,由于是用A的指针来进行析构,当调用virtual~B(){clear ();}时,析构函数中又调用了一个虚函数clear(),那么到底是调用A的clear()还是B的clear()呢?


在构造函数与析构函数中,调用的一切其他virtual函数都失去多态性。


所以,调用virtual ~B(){clear ();}时,会直接调用B的clear()。然后调用virtual
~A(){clear ();}时,并且在其中会直接调用A的clear()。


最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台