2010-05-02 190 views
0

我認爲虛擬課堂的一點是,如果一個派生類有一個公共基地,比方說,類基地,那麼派生指針可以被分配給一個指向基地類型的變量,而不使用任何顯式類型轉換。但是,如果我們在基類內,那麼我們怎樣才能調用派生類的函數。我將舉一個例子:虛擬課堂問題

class Graph{ 
    public: 
    Graph(string); 
    virtual bool addEdge(string,string); 
} 
class Direct:public Graph{ 
    public: 
    Direct(string); 
    bool addEdge(string,string); 
} 
Direct::Direct(string filename):Graph(filename){}; 

當我調用Direct類的構造函數時,它調用Graph。現在讓我們考慮Graph函數調用增加。

Graph(string str){ 
    addedge(str,str); 
} 

當它調用addge時,即使函數是虛擬的,它也會調用Graph :: edge。我想要的是,調用Direct :: addge。如何做呢?

+1

看到這個答案:http://stackoverflow.com/questions/448295#448295 – 2010-05-02 16:59:03

+0

?是U + 0130:拉丁大寫字母我與上面的點。 – 2010-05-02 17:32:28

回答

3

這是無法完成的。虛擬函數不能在構造函數中調用 - 至少它們不能用虛擬行爲調用。問題是派生類構造函數負責設置vtbl以指向虛擬函數的特定實例。基類的構造函數首先在派生構造函數之前執行,因此不可能直接解決此問題。

您可以在基類中使用某種形式的「init」函數來解決此問題,也可以使用工廠方法。

2

這是設計在C++中,請參閱C++ FAQ

在你的情況下,我也不明白爲什麼你會需要它 - 如果你想使用初始化幫助函數,沒有必要它是虛擬的。

0

看來你希望你的基類型的構造函數通過虛方法調用派生類型。由於派生類型尚未完全構建,因此這很麻煩。什麼是派生類型的重寫虛擬函數將用於狀態時,其類型尚未構建?您可能希望查看另一種設計模式,例如工廠,如果您真的需要它可以封裝兩步構建/初始化模式。

1

你的解釋是斯科特·梅耶的Effective C++

不要叫施工或破壞時虛函數,因爲這樣的電話將永遠不會去比當前執行構造函數和析構函數的多個派生類here