C ++,如何将派生类转换为受保护的基类?

时间:2011-12-19 08:59:34

标签: c++ inheritance casting base-class class-visibility

我需要将一个类强制转换为其受保护的基础:

class ComplicatedOne : public Object {
    //Lots of funcs I don't want or need.
};

class Line : protected ComplicatedOne {
    //Some funcs of ComplicatedOne get re-implemented or called by alias here
};

class Array {
    void Add (Object &obj);
};

main() {
    Array a;
    a.Add(new Line());
}

我需要向Line添加Array,但Object基数不可见。我应该公开重新使用它的方法,还是有一个我可以覆盖的隐式强制转换操作符?

2 个答案:

答案 0 :(得分:2)

有了这个,你告诉编译器你不能隐含地将Line转换为Object

class Line : protected Object {
};

但在我看来,你想要这样做,而且你应该这样做。所以让继承公开。这是一个设计问题。

不要仅仅为了将方法保留在基类protected中而继承protected

另一个选择是在Line中实现强制转换运算符:

class Line : protected Object 
{
public:
   operator Object&();
};

并像这样调用函数:

a.Add(Line());

而不是

a.Add(new Line());

在这种情况下,您无法隐式地转换指针。但是我建议更改继承类型。

答案 1 :(得分:2)

只有Line的朋友和子类才能执行此演员。你可以这样做:

class Line : protected Object {
    friend class Array;
};

class Array {
public:
    template<class T>
    void Add (T &obj) {
        add_impl(obj); // cast is accessible here, because Array is a friend 
                       // of Line
    }

private:
    void add_impl(Obj &obj);
};

您不必在那里使用函数模板,但我假设您有更多以Object方式派生的类,因此模板在那里会有所帮助。