Нет. Причина, по которой большинство программистов выбирают private, заключается в том, что они знают значение слова «инкапсуляция» ...

у использовать pimpl идиому с наследованием.

Вот базовый публичный класс и класс его реализации:

class A
{
    public:
      A(){pAImpl = new AImpl;};
      void foo(){pAImpl->foo();};
    private:
      AImpl* pAImpl;  
};
class AImpl
{
    public:
      void foo(){/*do something*/};
};

И я хочу иметь возможность создавать производный открытый класс с его классом реализации:

class B : public A
{
    public:
      void bar(){pAImpl->bar();};    // Can't do! pAimpl is A's private.
};        

class BImpl : public AImpl
{
    public:
      void bar(){/*do something else*/};
};

Но я не могу использовать pAimpl в B, потому что это личное.

Итак, я вижу несколько способов решить эту проблему:

Создайте элемент BImpl * pBImpl в B и передайте его A с помощью дополнительного конструктора A, A (AImpl *).Измените pAImpl для защиты (или добавьте функцию Get) и используйте его в B.B не должен наследоваться от A. Создайте элемент BImpl * pBImpl в B и создайте foo () и bar () в B, который будет использовать pBImpl.Любым другим путем?

Что мне выбрать?

Ответы на вопрос(5)

Ваш ответ на вопрос