如何将派生类强制转换为受保护的基类

C++, how to cast derived class to protected base?

本文关键字:转换 受保护 基类 派生      更新时间:2023-10-16

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

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碱不可见。我应该公开地重新实现它的方法,还是有一个可以覆盖的隐式强制转换操作符?

这样,您就告诉编译器您不能隐式地将Line转换为Object:

class Line : protected Object {
};

但在我看来,你想这样做,而且你应该这样做。所以将继承设为public。这是一个设计问题。

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

另一个选项是在Line:

中实现强制转换操作符
class Line : protected Object 
{
public:
   operator Object&();
};

并像这样调用函数:

a.Add(Line());
不是

a.Add(new Line());

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

只有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派生的类,因此模板将在这里有所帮助。