Абстрактные классы, наследование и виртуальные деструкторы - PullRequest
1 голос
/ 06 марта 2020

Несмотря на то, что деструктор 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;
}

1 Ответ

2 голосов
/ 06 марта 2020

Деструктор B и C тоже virtual. Деструкторы не будут наследоваться, но если деструктор базового класса равен virtual, производный деструктор переопределяет его и также равен virtual; несмотря на то, что virtual указано явно или нет.

Даже если деструкторы не наследуются, если базовый класс объявляет свой деструктор virtual, производный деструктор всегда переопределяет его.

и

Тогда эта функция в классе Derived также имеет значение virtual (независимо от того, используется или нет ключевое слово virtual в его объявлении) и переопределяет Base::vf (независимо от того, используется или нет) слово override используется в его декларации).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...