2

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

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());
}

我需要添加一个LineArrayObject基地是不可见的。我应该公开重新实现它的方法,还是有一个我可以覆盖的隐式转换运算符?

4

2 回答 2

3

这样,您就告诉编译器您不能将 a 隐式转换为Linea Object

class Line : protected Object {
};

但在我看来,你想这样做,而且你应该这样做。因此,将继承公开。这是一个设计问题。

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

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

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

并像这样调用函数:

a.Add(Line());

代替

a.Add(new Line());

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

于 2011-12-19T09:05:13.680 回答
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以这种方式派生的类,因此模板在那里会很有帮助。

于 2011-12-19T09:05:29.620 回答