我需要通过使其受到保护来从基类中抽象出很多接口(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实例作为成员保存,并公开您需要的内容。

这样,您可以保护它,但绝不会出现钻石级情况。

此外,如果ComplicatedOneObject,那么Line通过继承是Object,因此您无需再次继承。

关于c++ - C++多重继承,基类可见性和可怕的钻石。重新公开祖先基类公开?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8559339/

10-13 08:13