当指向派生对象的指针被Delete时,如果基类的析构函数是虚函数(应该如此),将执行正确的操作:调用派生类析构,调用基类析构。
class Mammal
{
public:
Mammal(){ cout << "Mammal Constructor!" << endl; }
virtual ~Mammal(){cout << "Mammal Destructor!" << endl;}//需要被继承的基类,析构函数都应该设置为虚函数,否则有可能无法析构基类
virtual void speak() const
{
cout << "Mammal speak!" << endl;
}
};
class Dog:public Mammal
{
public:
Dog()
{
cout << "Dog Constructor!" << endl;
}
~Dog()
{
cout << "Dog Destructor!" << endl;
}
void speak() const{ cout << "Wang wang..." << endl; }
};
int _tmain(int argc, _TCHAR* argv[])
{
Mammal* ptr= new Dog();
ptr->speak();
if (ptr)
{
delete ptr;
ptr = nullptr;
}
}
输出:
Mammal Constructor!
Dog Constructor!
Wang wang...
Dog Destructor!
Mammal Destructor!
请按任意键继续. . .