首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

虚拟析构函数的调试结果为什么跟理论不符?解决思路

2012-02-06 
虚拟析构函数的调试结果为什么跟理论不符?#includeiostreamusingnamespacestdclassAA{public:AA(){cout

虚拟析构函数的调试结果为什么跟理论不符?
#include   <iostream>
using   namespace   std;

class   AA
{
public:
  AA()
{
cout < < "A   construct " < <endl;
}

virtual   ~AA()
{
cout < < "A   destruct " < <endl;
}
};

class   BB   :   public   AA
{
public:
BB()
{
cout < < "B   construct " < <endl;
}

  ~BB()
{
cout < < "B   destruct " < <endl;
}
};
void   main()
{
AA*   aa=new   BB();
delete   aa;
}

当基类的析构是虚拟的时候,输出的是
A   construct
B   construct  
B   destruct
A   destruct   ,
当把virtual去掉的时候,输出的是
A   construct  
B   construct
A   destruct
可是理论上应该分别是
  A   construct
B   construct  
B   destruct

A   construct
B   construct  
B   destruct
A   destruct
呀,这是为什么?

[解决办法]
输出的是对的,不知道你的理论是怎么出来的.
当析构函数未被声明为虚拟的时候,用基类指针删除派生类对象会导致只有基类部分被删除,资源泄漏,所以就应该只有A的destruct.
而声明为虚拟时,一个派生类的基类部分总是最先被构造,最后被析构,所以先是B被析构,然后是A
[解决办法]
理论上应该是
A construct
B construct
B destruct
这种解释:理论是怎么说的?
[解决办法]
去看《深度探索C++对象模型》
输出结果已经明确表明,你的理论是错的。
[解决办法]
派生类指针无法指向基类对象
而基类指针既能指向基类对象,也能指向派生类对象,这样才能实现多态性
比如BB和CC都派生于AA,那么P-> FUN()当指针P指向BB时就是BB::FUN(),指向CC时就是CC::FUN(),依次类推


[解决办法]
AA* aa=new BB();的优势在哪里?

接口/数据存取上的优势

热点排行