美文网首页
为多态基类声明虚析构函数

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

作者: 半吊子生 | 来源:发表于2017-12-02 23:25 被阅读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. 如果基类的析构函数为纯虚函数的话,必须实现此纯虚函数,因为在继承类对象析构时,会首先调用继承类对象的析构函数,如果未实现的话,那么链接器会出错。

    相关文章

      网友评论

          本文标题:为多态基类声明虚析构函数

          本文链接:https://www.haomeiwen.com/subject/ylbobxtx.html