2009-02-03 92 views
2

也許我錯了,但這似乎是一個非常基本的問題。突然間,我的繼承鏈停止工作。編寫一個小的基本測試應用程序證明,這是我錯了(所以我不能責怪編譯器)。從構造函數調用虛擬函數

我有一個基類,在虛函數中有默認行爲。一個孩子課程從中衍生出來並改變行爲。

#include <iostream> 

class Base 
{ 
public: 
    Base() { print(); } 
    ~Base() {} 

protected: 
    virtual void print() { std::cout << "base\n"; } 
}; 

class Child : public Base 
{ 
public: 
    Child() {} 
    ~Child() {} 

protected: 
    virtual void print() { std::cout << "child\n"; } 
}; 

int main() 
{ 
    Base b; 
    Child c; 
} 

此打印:

base 
base 

當創建一個子組實例,爲什麼基地::打印()叫什麼名字?我認爲通過使用virtual關鍵字,可以將該函數替換爲派生類。

我在什麼時候感到困惑?

+0

可能重複的[C++虛函數從構造函數](http://stackoverflow.com/questions/496440/c-virtual-function-from-constructor) – Mark 2014-03-06 16:31:20

回答

18

由於子類尚未完全初始化,因此您正在調用構造函數中的虛函數,該函數不起作用。請參閱this StackOverflow question

+0

糟糕,完全相同的問題,奇怪的是沒有出現在我的搜索。如果有人願意,隨時關閉這個問題。 – Mizipzor 2009-02-03 13:31:48

2

請參閱this link以獲得詳細解釋(對於不從ctor/dtor調用虛擬功能)。

+1

只要在文章中略過,雖然它有非常有效的點,正如鏈接問題所指出的,關於在ctor中調用虛函數沒有任何「C++無效」。你只需要確定你得到的是什麼。雖然我承認這樣的做法會產生一些混亂。 – Mizipzor 2009-02-03 13:45:15

4

雖然你目前的問題是來自其他人提到的構造函數的虛方法調用,但我注意到你並沒有使析構函數變爲虛擬的。這通常是一件壞事。在你的情況下,析構函數是nops,並且沒有成員是析構函數的對象,但是如果你的代碼改變了,那麼容易發生壞事。

+0

是的,我很遺憾地讓這個問題變得虛擬。感謝提醒,但我意識到潛在的問題。 – Mizipzor 2009-02-03 23:38:53

相關問題