Я хочу использовать идиому 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 private.
};
class BImpl : public AImpl
{
public:
void bar(){/*do something else*/};
};
Но я не могу использовать pAimpl в B, потому что это A private.
Итак, я вижу некоторые способы его решения:
- Создайте член BImpl * pBImpl в B и передайте его A с дополнительным конструктором A, A (AImpl *).
- Изменить pAImpl для защиты (или добавить функцию Get) и использовать его в B.
- B не должен наследовать от A. Создайте член BImpl * pBImpl в B и создайте foo() и bar() в B, который будет использовать pBImpl.
- Любой другой способ?
Что мне выбрать?