文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>确保基类拥有虚析构函数

确保基类拥有虚析构函数

时间:2010-09-19  来源:zyd_cu

在下面的代码中,EnemyTarget用来表示敌方目标,其静态成员numTarget用于记录目标的个数;TankTarget也是代表敌方坦克目标,其继承自EnemyTarget。我们通过基类指针指向派生类对象,再通过基类指针删除派生类对象,结果发现当坦克目标被删除时,只有基类的析构函数被调用,而派生类的构造函数没有被调用,即numTank的数目根本没有减少。

C++语言标准关于这个问题的阐述非常清楚:当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。这意味着编译器生成的代码将会做任何它喜欢的事:重新格式化你的硬盘,给你的老板发电子邮件,把你的程序源代码传真给你的对手,无论什么事都可能发生。(实际运行时经常发生的是,派生类的析构函数永远不会被调用。)

对于这样的情形,需要将基类的析构函数定义为虚函数,以实现多态,保证TankTarget对象能通过基类指针正常的被删除。所以几乎所有的基类都包含虚析构函数,但对于不会被继承的类,将其析构函数定义为虚函数会改变类的数据分布,因为类的存储空间中会增加一个指向虚函数表的指针。

#include <iostream>
using namespace std;

class EnemyTarget {
public:
    EnemyTarget() { numTarget++; cout << numTarget << endl;}
    ~EnemyTarget() { numTarget--; cout << numTarget << endl;}
private:
    static int numTarget;
};

int EnemyTarget::numTarget = 0;

class TankTarget: public EnemyTarget {
public:
    TankTarget() { numTank++; cout << numTank << endl;}
    ~TankTarget() { numTank--; cout << numTank << endl;}
private:
    static int numTank;
};

int TankTarget::numTank = 0;

int main()
{
    EnemyTarget *p = new TankTarget;
    delete p;
    return 0;
}


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载