2013-02-12 136 views
4
class a //my base class 
{ 
public: 
    a() 
    { 
     foo(); 
    } 
    virtual void foo() = 0; 
}; 



class b : public a 
{ 
    public: 
    void foo() 
    { 
    } 
}; 

int main() 
{ 
    b obj; //ERROR: undefined reference to a::foo() 
} 

爲什麼它給我錯誤?純虛擬foo被定義。我需要更改我的代碼才能使其工作?我需要在其構造函數中調用基類的純虛方法。在構造函數中調用純虛函數給出錯誤

回答

13

在構造函數中調用虛函數是recognised as a bad thing to do

在派生類對象的基類構造過程中, 類型的對象是基類的對象。不僅虛擬函數 解析爲基類,而且使用運行時類型信息(例如,dynamic_cast(請參閱項目27)和typeid)將該對象視爲基類類型,而該語言的部分使用運行時 。

因此,您的實例化b調用a構造函數。這稱爲foo(),但是a上的foo()被調用。那(當然)是不確定的。

+0

我明白了。我會改變設計。 – user1873947 2013-02-12 11:12:02

+0

會使課堂抽象解決問題嗎? – Falaque 2013-02-12 11:14:57

+0

@Falaque哪個班? – user1873947 2013-02-12 11:19:28

1

foo函數在類a的構造函數中被調用,並且此時對象b尚未完全構造,因此它的foo實現不可用。

從「有效的C++」引用:

不要叫建設或破壞, 期間虛函數,因爲這樣的電話將永遠不會去比的 當前執行構造函數和析構函數更派生類

2

從一本書中引用了 「讓我們C++」,由亞什萬特Kanetkar

這是ALWA YS當前類的成員函數,是called.That ,虛擬機制不構造

所以,class afoo()被調用內工作。 由於它被宣佈爲pure virtual,它會報告一個錯誤

+0

它會報告錯誤...或者編譯正常,但會導致UB,如果您幸運,會崩潰。無論哪種方式,不要這樣做。 – 2016-07-03 00:40:25