簡體   English   中英

帶有g ++的虛擬關鍵字的奇怪(?)行為(Ubuntu)

[英]Strange (?) behavior with virtual keyword with g++ (Ubuntu)

我正在瀏覽有關虛擬析構函數和虛擬函數的注釋。 現在,當我嘗試編寫一個簡單的代碼來驗證我的學習時,

#include <iostream>
using namespace std;

class Base{
    public:
    Base (){
        cout << "Constructing base" <<endl;
    }
    void doSomething (){
        cout << "inside void " << endl;
    }
    ~Base (){
        cout << "Destructing base" << endl;
    }
};
class Derived : public Base{
    public:
    Derived(){
        cout << "Constructing derived" << endl;
    }
    void doSomething (){
        cout << "inside derived void " << endl;
    }
    ~Derived(){
        cout << "Destructing derived" << endl;
    }
};
int main(){
    Derived *d = new Derived();
    d->doSomething();
    delete d;
}

我不應該期望這樣的輸出:

Constructing base
Constructing derived
inside void
Destructing base

因為我沒有對派生和基的析構函數都使用virtual關鍵字? 您能否根據此示例解釋虛擬函數和虛擬析構函數?

我得到以下輸出:

Constructing base
Constructing derived
inside derived void 
Destructing derived
Destructing base

我糊塗了。

我在Ubuntu 12.04中使用g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

您得到正確的輸出。

Derived *d = new Derived();
d->doSomething();

它在調用Derived類成員函數。 為了使運行時函數調用分配機制起作用,您需要使用virtual關鍵字限定成員函數。 另外你應該寫-

Base *d = new Derived();

在上述情況下, d靜態類型與動態類型不同。 因此,派生類成員函數將在運行時被調用。 同樣,在這種情況下, Base類析構函數應該是virtual

暫無
暫無

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

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