我需要将一个类强制转换为其受保护的基础:
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
基数不可见。我应该公开重新使用它的方法,还是有一个我可以覆盖的隐式强制转换操作符?
答案 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
方式派生的类,因此模板在那里会有所帮助。