【问题标题】:Abstract classes, inheritance and virtual destructors抽象类、继承和虚析构函数
【发布时间】:2020-06-19 08:12:44
【问题描述】:

即使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;
}

【问题讨论】:

  • 析构函数也是函数。如果基类将其声明为虚拟,则所有派生类也会这样做。
  • 我想你误解了 ~B 是否是虚拟的。 〜A是虚拟的,〜B怎么可能不是? ~C 也一样,它也会是虚拟的。因为 ~A 是虚拟的。仅仅因为您没有明确将其标记为虚拟并不意味着它不是。

标签: c++ inheritance overriding abstract-class virtual


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2023-03-30
    • 2011-11-17
    • 2015-08-06
    • 1970-01-01
    • 2016-03-01
    • 2018-11-29
    • 1970-01-01
    • 2020-02-10
    相关资源
    最近更新 更多