Нет. Причина, по которой большинство программистов выбирают 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.Любым другим путем?Что мне выбрать?