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

问题描述 投票:0回答:1

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

这是否意味着只有最外面的抽象类需要具有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;
}
c++ inheritance overriding abstract-class virtual
1个回答
0
投票

BC的析构函数也都是virtual。析构函数将不会被继承,但是如果基类的析构函数为virtual,则派生的析构函数将覆盖它并为virtual;是否指定virtual

即使不继承析构函数,但如果基类将其析构函数声明为虚拟的,则派生的析构函数始终会覆盖它。

然后,Derived类中的此函数也是虚拟的(在其声明中是否使用了关键字virtual,并且重写了Base :: vf(在声明中是否使用了override这个词)。

© www.soinside.com 2019 - 2024. All rights reserved.