为多态基类声明虚析构函数

2017-12-02  本文已影响26人  半吊子生

示例

#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;
}

原因

  1. 在此示例中,因为对于SprotCar对象的销毁必须使用delete car的形式,如果基类的析构函数不为virtual的话,那么不会析构继承类的对象,也就是说对于car的真是对象存在的是局部的销毁。
  2. 如果在基类之中加入virtual析构函数的话,那么调用析构函数的时候,将会启用多态的特性,只这里首先将会调用~SportCar(),那么销毁对象的顺序是:

    1. 调用基类的析构函数~Car()

    2. 析构继承类的成员变量。

    3. 执行继承类对象的析构函数的函数体。
  3. 如果基类的析构函数为纯虚函数的话,必须实现此纯虚函数,因为在继承类对象析构时,会首先调用继承类对象的析构函数,如果未实现的话,那么链接器会出错。
上一篇下一篇

猜你喜欢

热点阅读