C ++, как привести производный класс к защищенной базе? - PullRequest
1 голос
/ 19 декабря 2011

Мне нужно привести класс к защищенной базе:

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 ]

2 голосов
/ 19 декабря 2011

Только друзья и подклассы 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, поэтому шаблон будет полезен там.

2 голосов
/ 19 декабря 2011

При этом вы сообщаете компилятору, что не можете неявно преобразовать Line в Object:

class Line : protected Object {
};

Но мне кажется, что вы хотите это сделать, а также что вы должны это сделать. Так что сделайте наследство публичным. Это вопрос дизайна.

Не делайте наследство protected, только чтобы сохранить методы в базовом классе protected.

Еще один вариант - реализовать оператор приведения в строке:

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

и вызвать функцию следующим образом:

a.Add(Line());

вместо

a.Add(new Line());

Вы не можете неявно использовать указатели в этой ситуации. Однако я предлагаю изменить тип наследования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...