C ++多重继承,基类可见性和可怕的钻石。将祖先基类重新公开为公共?

时间:2011-12-19 09:31:21

标签: c++ inheritance multiple-inheritance access-specifier

我需要通过使其受保护来从基类中抽象出很多接口,但我还需要公共访问一个简单的祖先类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());
}

3 个答案:

答案 0 :(得分:2)

你可以使用作文。

您可以将ComplicatedOne的实例作为成员,并展示您需要的内容。

这样你可以保护它,但永远不会有钻石情况。

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

答案 1 :(得分:1)

你对你的真正问题非常模糊,但对我而言,听起来好像你只想使用继承来获得代码重用。
你不应该这样做。看看这个article 对我而言,听起来好像作文更符合你的要求。在类Line中创建ComplicatedOne的成员,并将调用委托给该成员。然后你不需要继承它。

答案 2 :(得分:0)

    return Object::Equals(obj);

无法编译,因为它不明确:有两个Object基础对象。

此外,从Line*Object*的转换是不明确的,并且不能将歧义解析为第二个Object基类(从左到右的基类顺序),所以第二个除了造成困难之外,Object基不起任何作用。

目前尚不清楚你要做的是什么:ComplicatedOne类代表什么?如果要再次覆盖每个Object虚函数,为什么要继承它?