2012-07-03 80 views
0

可能重複:
Calling virtual function of derived class from base class constructor?基類的構造不會調用虛方法derivied類版本

我有以下文件(原諒錯別字,我從內存中快速重寫代碼)

BaseReader(){ 
    openFile(); 
} 

void BaseReader::openFile(){ 
    //logic to open file 
} 

打開文件被聲明爲虛擬公共方法(它被保護,但我在試圖弄清楚什麼是錯誤的時候把它公開化了)。 SortReader定義爲:

class SortReader: public BaseReader{ 
    public: 
      SortReader(); 
      void openFile(); 
    }; 

用下面的代碼:

SortReader::SortReader(): BaseReader(){} 

SortReader::openFile(){ 
    sortFile(); 
    BaseReader::openFile(); 
} 

當我嘗試構建SortReader對象sortFile方法不會被調用。我可以在調試器中查看它,並觀察SortReader調用BaseReader構造函數。BaseReader構造函數調用openFile,它調用OpenFile的BaseReader版本。我希望它調用SortReader的打開文件的實現。我需要做些什麼來實現這一目標?

+2

顯然的問題是,'中openFile()'未聲明爲虛... –

+0

@ RichardJ.RossIII:根據這是一個問題,雖然沒有看到我們不能完全確定的聲明。但無論是否,您都無法從基類構造函數中調用派生類的版本。 –

回答

2

你不能。在構造函數完成之前,該對象尚未完全構建。一般來說,從構造函數中調用virtual方法是一個壞主意。

您可以委託邏輯來獨立非virtual方法:

SortReader::openFile(){ 
    sortFileInternal();  //not virtual 
          //defined in SortReader 
    BaseReader::openFile(); 
} 

SortReader::sortFile()  //the virtual method 
{ 
    sortFileInternal(); 
} 
+0

@dsollen - 請參閱:http://www.artima.com/cppsource/nevercall.html – phonetagger