Какая польза от создания друга-друга и его наследования? - PullRequest
1 голос
/ 29 октября 2019

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

class Derived : public Base
{
        friend class Base; // serves as a factory
    protected:
        pthread_spinlock_t allocLock;
        bool isSafe{ true };

        Derived();
        char *funcA() override;

    public:
        void funcB( bool _in ) override;
        virtual ~Derived();
};

Я не могу понять, если Base было унаследовано, тогда почему оно было сделано friend изDerived. Кроме того, как комментарий служит здесь фабрикой имеет смысл?

Если бы он имел доступ к функции Base, оператора :: было бы достаточно.

это больше связано с дизайнерским подходом?

1 Ответ

0 голосов
/ 31 октября 2019

Создание базового класса другом дает базовому классу доступ к закрытым членам производного класса. Трудно сказать, в чем причина этого, не видя определения class Base. Кажется, что комментарий указывает, что базовый класс имеет функции-члены для создания объектов производных классов.

Вообще, это плохой дизайн. Плохо, когда базовый класс вообще знает о своих производных классах, и еще хуже, когда у него есть доступ к закрытым членам производных классов. Зависимости должны идти только одним путем: производные классы зависят от базового класса, а не наоборот. Другими словами, изменение в производном классе не должно нарушать базовый класс.

Если вам нужна фабрика, правильный способ сделать это - поместить логику создания в отдельный класс фабрики, а не вбазовый класс.

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