基本クラスのメソッドをスレッドとして開始する子クラスがあります。子クラスは、基本クラスからの純粋仮想メソッドも実装しています。次に、スレッドは、スレッド内の純粋仮想メソッドの子の実装バージョンを呼び出す必要がありますが、スレッドは「純粋仮想メソッドが呼び出されました」という例外をスローします。以下のコードは、Child の構築時に何が起こるかを示しています。
class Base {
std::thread messageThread;
virtual void processMessage(std::string msg) = 0;
static void checkForMessages(Base *c) {
while(true) {
std::string msg = "Hello";
c->processMessage(msg);
}
}
};
class Child : public Base {
Child() {
messageThread = std::thread(checkForMessages, this);
}
void processMessage(std::string msg) {
std::cout << "Message: " << msg << std::endl;
}
};
私の理解では、コンストラクターが終了するまで Child は引き続き Base と見なされるため、スレッドは processMessage を純粋な仮想関数としてしか見ることができません。Base のすべての子に対して checkForMessages を実装することもできますが、それではそもそも Base クラスを持つという目的が無効になります。
これを正しく実装するにはどうすればよいですか? お手伝いありがとう!
編集: 問題を示す完全な例と、修正を試みた例: https://gist.github.com/4590476