簡體   English   中英

從 c++ 中派生的 class 的析構函數調用虛擬 function

[英]Calling a virtual function from a destructor of a derived class in c++

這是我的 c++ 代碼片段

class A {
public:
    virtual void method() {
        cout << "A::method" << endl;
    }

    virtual ~A() {
        cout << "A::destructor" << endl;
    }

};

class B : public A {
public:
    virtual void method() {
        cout << "B::method" << endl;
    }

    virtual ~B() {
        cout << "B::destructor" << endl;
        method();
    }
};

int _tmain()
{    
    A* a = new B();

    a->method();

    delete a;

    return 0;
}

我了解到從構造函數或析構函數調用任何虛函數是不可取的。 在派生的 class B 的析構函數中,我調用名為“method()”的虛擬 function。

這是 output 消息。

B::method
B::destructor
B::method
A::destructor

在我看來完全沒有問題。 虛擬 function 知道其 object 類型並打印“B::method()”。 這是一種應該避免的未定義行為嗎?

從概念上講, B中的所有虛函數都可以在析構函數體中訪問,因此您的代碼很好並且定義良好。

但是您的代碼非常脆弱:如果有一個B的子 class 的method被覆蓋,那將是另一回事。 在這種情況下,寫B::method(); B的析構函數體中就足夠了。

簡短的回答:最好避免在構造函數和析構函數中調用虛方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM