#include<iostream>
using namespace std;
class Huahome
{
public:
virtual void Show() = 0;
virtual ~Huahome() {};
};
class Huaba :public Huahome
{
public:
Huaba() { cout << "花爸会武功" << endl; }
void Show() { cout << "花爸当兵" << endl; }
~Huaba() { cout << "析构" << endl; }
};
class Huadi :virtual public Huaba
{
public:
Huadi() { cout << "花弟年轻" << endl; }
void Show() { cout << "花弟当兵" << endl; }
~Huadi() { cout << "析构" << endl; }
};
class Huamei :virtual public Huaba
{
public:
Huamei() { cout << "花姐扮男装" << endl; }
void Show() { cout << "花姐当兵" << endl; }
~Huamei() { cout << "析构" << endl; }
};
int mian()
{
Huahome* PHua;
Huaba ba;
PHua = &ba;
PHua->Show();
cout << "****************************************************" << endl;
Huadi di;
PHua = &di;
PHua->Show();
cout << "****************************************************" << endl;
Huamei mei;
PHua = &mei;
PHua->Show();
cout << "****************************************************" << endl;
return 0;
}
这个为什么报错呀,是有什么问题吗?
main 方法, 不是 mian
首先析构函数可以为虚函数,而且当要使用基类指针或引用调用子类时,最好将基类的析构函数声明为虚函数,否则可以存在内存泄露的问题。
每个析构函数(不加 virtual) 只负责清除自己的成员。
基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全,造成内存泄漏。所以,将析构函数声明为虚函数是十分必要的。
反正你在写一个类时,将其析构函数写为虚函数总不会错,一样重载的。
举例说明:
子类B继承自基类A:
A *p = new B; delete p;
补充:
B *p = new B; delete p;
此时也是先调用B的析构函数,再调用A的析构函数。