【发布时间】:2019-08-30 09:19:57
【问题描述】:
我需要为具有多个继承级别的多个对象实现一个 isEqual 方法。出于这个原因,我决定不创建接口,因为该方法不是纯虚拟的,而只是我以后可以用作标记的类。
这些类实现了一个方法 isEqual。由于我需要定义默认行为,因此这些方法不是纯虚拟的。
class A_Interface {
virtual isEqual(shared_ptr<A_Interface> obj);
...
virtual otherMethod1();
}
class B_Interface : public virtual A_Interface {
virtual isEqual(shared_ptr<B_Interface> obj);
...
virtual otherMethod2();
}
class C_Interface : public virtual B_Interface {
virtual isEqual(shared_ptr<C_Interface> obj);
...
virtual otherMethod3();
}
每个类都实现了它自己的上面提到的“类接口”标签类,并像这样从父类继承:
class A : public virtual A_interface;
{
isEqual(shared_ptr<A_Interface> obj){
...
}
};
class B : public virtual A,
public virtual B_interface
{
using A::isEqual;
isEqual(shared_ptr<B_Interface> obj){
...
}
};
class C : public virtual B,
public virtual C_interface
{
using B::isEqual;
isEqual(shared_ptr<C_Interface> obj){
...
bool parentIsEquals = B::isEqual(obj);
...
}
};
为了避免 B 类中的名称隐藏,我明确声明了
using A::isEqual;
解决了问题的语句,但现在在类 C 中,当我想引用方法“isEqual”父类 B 并像这样明确指定它时
bool parentIsEquals = B::isEqual(obj);
我得到了错误
"B::isEqual' is ambiguous"
我也明白,因为我有两个签名,即
using A::isEqual;
isEqual(shared_ptr<B_Interface> obj);
我不知道如何解决这个问题,因为这种情况下的参数“obj”确实与购买的签名匹配。 我想了解是否有更好的模式/建议来实现这个问题。
【问题讨论】:
-
到处都是代码异味 :) 您到底想比较什么? as 和 Bs 和 Cs 和智能指针呢?你不需要所有这些机器。
-
如果我有一个
std::unique_ptr<B>并想将它与A进行比较怎么办?如果我有一个原始指针怎么办?还是参考?为什么你的平等接口关心它的用户如何管理对象生命周期?
标签: c++