派生类的析构函数先后有关问题
派生类的析构函数先后问题
#include <iostream>
using namespace std;
class CA{
public:
CA() { cout << "A's constructed.\n"; }
void fun() { cout << "I am A\n"; }
~CA() {cout << "A's destructed.\n"; }
};
class CB:public CA{
public:
CB() { cout << "B's constructed.\n"; }
void fun() { cout << "I am B\n"; }
~CB() {cout << "B's destructed.\n"; }
};
int main(){
CA * p_a;
p_a = new CB;
delete p_a;
return 0;
}
结果:
A's constructed.
B's constructed.
A's destructed.
不明白,为什么只有A被析构,B呢
------解决方案--------------------
未被初始化的内存,为什么其中的数据是不确定的,因为内存回收后是不清除数据的
,我决得父类的析构函数被调用后,这个对象的所有数据就变成了可以被其他任意
程序所占有的数据.析构也许是摸掉数据的左右,加一个虚函数我决得差不多就掉用
子类的析构函数了,根据多态.
virtual ~CA() {cout < < "A's destructed.\n"; }
------解决方案--------------------
因为你用的是基类指针指向派生类对象,根据多态的规则,你这里只会调用基类的析构函数。
如果不是通过这样的一个指针来析构的话,而是一个派生类对象的生命期结束时,那么析构的顺序将是没问题的:先CB后CA
所以我想,析构函数会通过某种方式或手段,获知自己是否是派生类,因而调用基类的析构函数(如果是派生类)。
#include <iostream>
using namespace std;
class CA{
public:
CA() { cout << "A's constructed.\n"; }
void fun() { cout << "I am A\n"; }
~CA() {cout << "A's destructed.\n"; }
};
class CB:public CA{
public:
CB() { cout << "B's constructed.\n"; }
void fun() { cout << "I am B\n"; }
~CB() {cout << "B's destructed.\n"; }
};
int main(){
CA * p_a;
p_a = new CB;
delete p_a;
return 0;
}
结果:
A's constructed.
B's constructed.
A's destructed.
不明白,为什么只有A被析构,B呢
------解决方案--------------------
未被初始化的内存,为什么其中的数据是不确定的,因为内存回收后是不清除数据的
,我决得父类的析构函数被调用后,这个对象的所有数据就变成了可以被其他任意
程序所占有的数据.析构也许是摸掉数据的左右,加一个虚函数我决得差不多就掉用
子类的析构函数了,根据多态.
virtual ~CA() {cout < < "A's destructed.\n"; }
------解决方案--------------------
因为你用的是基类指针指向派生类对象,根据多态的规则,你这里只会调用基类的析构函数。
如果不是通过这样的一个指针来析构的话,而是一个派生类对象的生命期结束时,那么析构的顺序将是没问题的:先CB后CA
所以我想,析构函数会通过某种方式或手段,获知自己是否是派生类,因而调用基类的析构函数(如果是派生类)。