繁体   English   中英

抽象类、继承和虚拟析构函数

[英]Abstract classes, inheritance and virtual destructors

即使B的析构函数不是virtual ,我仍然可以通过B指针调用C的析构函数。

这是否意味着只有最外层的抽象类需要有一个virtual析构函数?

如果是这样,为什么它会这样工作?

是因为B继承了A的析构函数吗?

#include <iostream>

struct A {
    virtual ~A() {
        std::cout << "~A\n";
    }

    virtual void
    function_a() = 0;
};

struct B : A {
    /*
    virtual ~B() {
        std::cout << "~B\n";
    }
    */

    virtual void
    function_b() = 0;
};

struct C : B {
    ~C() override {
        std::cout << "~C\n";
    }

    void
    function_a() override {
        std::cout << "function_a\n";
    }

    void
    function_b() override {
        std::cout << "function_b\n";
    }
};

int
main() {
    B * b = new C();

    b->function_a();
    b->function_b();

    delete b;
}

BC的析构函数也是virtual 析构函数不会被继承,但如果基类的析构函数是virtual ,则派生的析构函数会覆盖它并且也是virtual 尽管显式指定了virtual

即使析构函数没有被继承,如果基类声明它的析构函数virtual ,派生的析构函数总是覆盖它。

那么这个 Derived 类中的函数也是virtual (无论其声明中是否使用关键字virtual )并覆盖Base::vf (无论其声明中是否使用单词override )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM