表面的な問題は、まだ知られていない仮想関数を呼び出すことです (オブジェクトは親から子へと構築されるため、vtables も同様です)。あなたのコンパイラはそれについてあなたに警告しました。
私が見る限り、本質的な問題は、継承によって機能を再利用しようとすることです。これはほとんどの場合、悪い考えです。いわば設計上の問題です:)
基本的に、テンプレート メソッド パターンをインスタンス化して、何をwhenから分離しようとします。最初にデータを (何らかの方法で) 読み取り、次にそれを (何らかの方法で) 処理します。
これはおそらく集計でよりうまく機能します。適切なタイミングで呼び出されるように、Processing 関数を Template メソッドに与えます。おそらく、読み取り機能についても同じことができます。
集計は、次の 2 つの方法で実行できます。
- 仮想関数の使用 (つまり、ランタイム バインディング)
- テンプレートの使用 (つまり、コンパイル時のバインディング)
例 1: ランタイム バインディング
class Data {};
class IReader { public: virtual Data read() = 0; };
class IProcessor { public: virtual void process( Data& d) = 0; };
class ReadNProcess {
public:
ReadNProcess( IReader& reader, IProcessor processor ){
processor.process( reader.read() );
}
};
例 2: コンパイル時バインディング
template< typename Reader, typename Writer > // definitely could use concepts here :)
class ReadNProcess {
public:
ReadNProcess( Reader& r, Processor& p ) {
p.process( r.read() );
}
};