我想实现两个对象之间的交互,其类型派生自一个公共基类。存在默认交互,一旦相同类型的对象交互,可能会发生特定的事情。这是使用以下双重调度方案实现的:
#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"
}
不幸的是,关于这段代码,我有两个完全不同的问题:
- 你认为这是一个合理的方法吗?你会建议一些不同的东西吗?
- 如果我省略前两种
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,谢谢。我的第一个问题呢?对此方法有何评论?