我需要通过使其受保护来从基类中抽象出很多接口,但我还需要公共访问一个简单的祖先类Object
。我是否可以在没有对这些祖先进行写/编辑访问的情况下协商dreaded diamond,并且仍然只提供基本API,但会再次公开Object
的API?
class Object {
virtual bool Equals (const Object &obj) const;
virtual int GetHashCode (void) const;
};
class ComplicatedOne : public Object {
//Lots of funcs I don't want or need.
};
class Line : protected ComplicatedOne, public Object {
//Some funcs of ComplicatedOne get re-implemented or called by alias here
public:
virtual bool Equals(const Object &obj) const {
return Object::Equals(obj);
}
virtual int GetHashCode() const {
return Object::GetHashCode();
}
};
class Array {
void Add (Object &obj);
Object *GetAt (int i);
};
main() {
Array a;
a.Add(new Line());
}
答案 0 :(得分:2)
你可以使用作文。
您可以将ComplicatedOne
的实例作为成员,并展示您需要的内容。
这样你可以保护它,但永远不会有钻石情况。
此外,如果ComplicatedOne
是Object
,那么Line
是继承的Object
,因此您无需再次继承。
答案 1 :(得分:1)
你对你的真正问题非常模糊,但对我而言,听起来好像你只想使用继承来获得代码重用。
你不应该这样做。看看这个article
对我而言,听起来好像作文更符合你的要求。在类Line中创建ComplicatedOne
的成员,并将调用委托给该成员。然后你不需要继承它。
答案 2 :(得分:0)
return Object::Equals(obj);
无法编译,因为它不明确:有两个Object
基础对象。
此外,从Line*
到Object*
的转换是不明确的,并且不能将歧义解析为第二个Object
基类(从左到右的基类顺序),所以第二个除了造成困难之外,Object
基不起任何作用。
目前尚不清楚你要做的是什么:ComplicatedOne
类代表什么?如果要再次覆盖每个Object
虚函数,为什么要继承它?