我需要通过使其受到保护来从基类中抽象出很多接口(interface),但是我还需要公共(public)访问简单的祖先类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());
}
最佳答案
您可以使用合成。
您可以将ComplicatedOne
实例作为成员保存,并公开您需要的内容。
这样,您可以保护它,但绝不会出现钻石级情况。
此外,如果ComplicatedOne
是Object
,那么Line
通过继承是Object
,因此您无需再次继承。
关于c++ - C++多重继承,基类可见性和可怕的钻石。重新公开祖先基类公开?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8559339/