0

重複の可能性:
基本クラスのコンストラクターから派生クラスの仮想関数を呼び出していますか?

私は次のファイルを持っています(タイプミスを許してください、コードをメモリからすばやく書き直します)

BaseReader(){
    openFile();
}

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

開いているファイルは、.h で仮想パブリック メソッドとして宣言されています (保護されていましたが、何が問題なのかを把握しようとしてパブリックに切り替えました)。SortReader は次のように定義されます。

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

次のコードを使用します。

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

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

SortReader オブジェクトを作成しようとすると、sortFile メソッドが呼び出されません。デバッガーでそれをウォークスルーし、SortReader が BaseReader コンストラクターを呼び出すのを見ることができます BaseReader コンストラクターは、openFile の BaseReader バージョンを呼び出す openFile を呼び出します。SortReader の開いているファイルの実装を呼び出したい。そのためには何をする必要がありますか?

4

1 に答える 1

2

できません。コンストラクターが終了するまで、オブジェクトはまだ完全には構築されていません。一般に、コンストラクターからメソッドを呼び出すことvirtualはお勧めできません。

virtualロジックを別の非メソッドに委任できます。

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

SortReader::sortFile()      //the virtual method
{
    sortFileInternal();
}
于 2012-07-03T17:22:40.043 に答える