簡體   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