首页 » C语言 » 构造函数与析构函数以及virtual

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

原文 http://blog.csdn.net/fyyyr/article/details/79213099

2018-02-01 02:00:47阅读(230)

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

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()。

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹