我想在C ++中实现以下内容:
我希望有一组单个类的子类,能够调用函数,该函数接受任何这些类型的对象。应该有一个泛型实现,调用混合类型或基类型和专用实现,如果相同派生类型的两个对象是用作参数。
据我所知,这是双重调度的经典应用。但是,我有以下约束:
必须可以从现有类中派生新类,并为这些新类添加新的对函数,而无需更改现有类,例如在外部库中。
我在my last question中提出的方法是错误的,并且那里提出的解决方案仅适用于编写基类时已知的类型。
有关如何实施此建议的任何建议?这甚至可能吗?
更新:代码说了千言万语。以下方法有效:
#include <iostream>
class B;
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;
}
virtual void PreCompose(B* other);
};
class B : public A
{
public:
using A::PreCompose;
virtual void PostCompose(A* other)
{
other->PreCompose(this);
}
virtual void PostCompose(B* other)
{
other->PreCompose(this);
}
virtual void PreCompose(B* other)
{
std::cout << "Precomposing with a B object" << std::endl;
}
};
void A::PreCompose(B* other)
{
PreCompose((A*)other);
}
int main()
{
B b;
A* p = &b;
p->PostCompose(p); // -> "Precomposing with a B object"
}
但在实施B
时需要了解A
。还有更好的方法吗?
答案 0 :(得分:1)
由于派生类只需检测参数类型是否与对象类型匹配,因此您只需使用简单的检查即可。
virtual void foo( base *argument_base ) {
if ( derived *argument = dynamic_cast< derived * >( argument_base ) ) {
argument->something = pair_match_foo;
} else {
base_class::foo( argument_base );
}
}