警告:これは、私がこの方法で解決することはおそらくないだろう何かについてのばかげた質問であることに注意してください。したがって、矛盾したタイトル。しかし、非常に大規模なシステムで実行したコードに似たものを実際に見たので、興味をそそられました。:)
単純化されたクラスがあるとしましょう:
class Foo
{
void a();
virtual void b();
}
それから別のクラス
class Bar : public Foo
{
void a();
}
プログラムの一般的な部分がこれらすべてのクラスを type の基本クラスとして処理する場合Foo
、どのようにしてa
内の「正しい」バージョンの関数を呼び出すのが最善b
でしょうか? オブジェクトが型である可能性があるためBar
。また、従来の理由により、既存のコードを変更して、基本クラスを関数仮想にすることができなかったとします。
私がしたことa
は、基本クラスで仮想化し、そのオプションがあったので実装b
することでした。Bar
しかし、議論のために、これは不可能または許可されていなかったとしましょう。このようなものを使用して回避策を実装するのは、どれほど「間違っている」でしょうか。
void b() {
...
Bar* dabar;
if((dabar = dynamic_cast<Bar*>(this)) != NULL) {
dabar->a();
}
else {
a();
}
}
私が言ったように、これは基本クラスを扱い、子クラスの関数を呼び出したい場合であることに注意してください。その逆ではありません。