型が共通の基本クラスから派生した 2 つのオブジェクト間の相互作用を実装したいと考えています。デフォルトの相互作用があり、同じタイプのオブジェクトが相互作用すると特定のことが起こる場合があります。これは、次の二重ディスパッチ スキームを使用して実装されます。
#include <iostream>
class A
{
public:
virtual void PostCompose(A* other)
{
other->PreCompose(this);
}
virtual void PreCompose(A* other)
{
std::cout << "Precomposing with an A object" << std::endl;
}
};
class B : public A
{
public:
virtual void PostCompose(A* other) // This one needs to be present to prevent a warning
{
other->PreCompose(this);
}
virtual void PreCompose(A* other) // This one needs to be present to prevent an error
{
std::cout << "Precomposing with an A object" << std::endl;
}
virtual void PostCompose(B* other)
{
other->PreCompose(this);
}
virtual void PreCompose(B* other)
{
std::cout << "Precomposing with a B object" << std::endl;
}
};
int main()
{
A a;
B b;
a.PostCompose(&a); // -> "Precomposing with an A object"
a.PostCompose(&b); // -> "Precomposing with an A object"
b.PostCompose(&a); // -> "Precomposing with an A object"
b.PostCompose(&b); // -> "Precomposing with a B object"
}
残念ながら、このコードに関してまったく異なる質問が 2 つあります。
- これは合理的なアプローチだと思いますか?何か違うことを提案しますか?
- 最初の 2 つのメソッドを省略すると、最後の 2 つのメソッドがメソッドを隠して
B
いるというコンパイラの警告とエラーが表示されます。何故ですか?ポインターをポインターにキャストするべきではありませんか?B
A
A*
B*
更新:追加することがわかりました
using A::PreCompose;
using A::PostCompose;
エラーと警告が消えますが、なぜこれが必要なのですか?
更新 2 : これはここできちんと説明されています: http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9、ありがとう。私の最初の質問はどうですか?このアプローチに関するコメントはありますか?