C++ 初学者, 帮忙解答下, 感激不尽!

#include<iostream>
using namespace std;
class Human
{
public:
Human()
{
cout<<"基类构造"<<endl;
}
void stand()
{
cout<<"I can stand!"<<endl;
}
void run()
{
cout<<"I can run"<<endl;
}
~Human()
{
cout<<"基类析构"<<endl;
}
};
class Father :public Human
{
public:
Father()
{
cout<<"子类构造"<<endl;
}
void run()
{
cout<<"I run faster!"<<endl;
}
void eat()
{
cout<<"I can eat"<<endl;
}
~Father()
{
cout<<"子类析构"<<endl;
}
};

int main(void)
{
Human *p=new Father;
delete p;
return 0;
}

谁能帮忙解释下 为什么执行了基类的构造函数和派生类的构造函数,但是只执行了基类的析构函数, 而没有执行派生类的析构函数。

首先你按照我说的改一下代码,在父类和子类析构函数前加virtual关键字;
当你在new一个子类对象的时候,首先执行父类构造函数,在执行子类构造函数,但是当你把子类指针赋给一个父类指针时,会发生数据的截断,对于这个父类指针而言,他只能执行父类中的各种函数,当然在析构的时候他也只能执行父类的析构函数,但是如果加了virtual关键字,会产生多态性,即共有派生类指针赋给基类指针会产生多态性。所以这样就可以利用多态性,从子类的资源开始析构,利用子类析构的同时会析构父类资源的特性,达到释放所有资源,避免内存泄露
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-08-07
因为基类的析构函数不是虚析构函数,所以系统根据指针的类型调用相应类的析构函数。
delete p; // 调用 Human 类的析构函数。
根据 C++ 标准,这一行为是未定义的。

将基类的析构函数改为虚析构函数。
~Human()
改为:
virtual ~Human()

当基类的析构函数为虚析构函数时,将根据指针指向对象的类型调用相应类的析构函数。
delete p; // 先调用 Father 类的析构函数,再调用 Human 类的析构函数。
相似回答
大家正在搜