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



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

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

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

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

#include <iostream>
struct A {
    virtual ~A() {
        std::cout << "~An";
    }
    virtual void
    function_a() = 0;
};
struct B : A {
    /*
    virtual ~B() {
        std::cout << "~Bn";
    }
    */
    virtual void
    function_b() = 0;
};
struct C : B {
    ~C() override {
        std::cout << "~Cn";
    }
    void
    function_a() override {
        std::cout << "function_an";
    }
    void
    function_b() override {
        std::cout << "function_bn";
    }
};
int
main() {
    B * b = new C();
    b->function_a();
    b->function_b();
    delete b;
}

BC的析构函数也是virtual。析构函数不会被继承,但如果基类的析构函数是virtual,则派生的析构因子会覆盖它,并且也是virtual;不管是否明确指定CCD_ 13。

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

Derived类中的此函数也是virtual(无论关键字virtual是否在其声明中使用(,并覆盖Base::vf(无论单词override是否在其宣布中使用(。

最新更新