Search code examples
c++inheritancecastingbase-classclass-visibility

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


I need to cast a class to its protected base:

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

I need to add a Line to an Array but the Object base is not visible. Should I re-impliment its methods publicly or is there an implicit cast operator I could override?


Solution

  • With this, you're telling the compiler that you can't implicitly convert a Line to an Object:

    class Line : protected Object {
    };
    

    But it seems to me that you want to do this, and also that you should do this. So make the inheritance public. This is a design question.

    Don't make the inheritance protected just to keep methods in the base class protected.

    One other option is to implement the cast operator in Line:

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

    and call the function like so:

    a.Add(Line());
    

    instead of

    a.Add(new Line());
    

    You can't implicitly cast pointers in this situation. However I suggest changing the inheritance type.