示例
#include <iostream>
using namespace std;
class Car
{
public:
virtual void drive() = 0;
virtual ~Car() = 0;
};
/*
如果未实现此纯虚函数的话,
链接器将会提示ld: symbol(s) not found for architecture x86_64
*/
Car::~Car()
{
}
class SportCar: public Car
{
public:
virtual void drive() { cout << "I am driving" << endl; }
};
int main()
{
Car* car = new SportCar();
car->drive();
delete car;
return 0;
}
原因
- 在此示例中,因为对于SprotCar对象的销毁必须使用
delete car
的形式,如果基类的析构函数不为virtual的话,那么不会析构继承类的对象,也就是说对于car的真是对象存在的是局部的销毁。
- 如果在基类之中加入virtual析构函数的话,那么调用析构函数的时候,将会启用多态的特性,只这里首先将会调用
~SportCar()
,那么销毁对象的顺序是:
- 调用基类的析构函数
~Car()
。
- 析构继承类的成员变量。
- 执行继承类对象的析构函数的函数体。
- 如果基类的析构函数为纯虚函数的话,必须实现此纯虚函数,因为在继承类对象析构时,会首先调用继承类对象的析构函数,如果未实现的话,那么链接器会出错。