Idioma Pimpl com herança

Eu quero usar o idioma pimpl com herança.

Aqui está a classe pública base e sua classe de implementação:

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

E eu quero poder criar a classe pública derivada com sua classe de implementação:

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*/};
};

Mas não posso usar o pAimpl em B porque é privado.

Então, eu vejo algumas maneiras de resolvê-lo:

Crie o membro BImpl * pBImpl em B e passe-o para A com o construtor A adicional, A (AImpl *).Altere o pAImpl para ser protegido (ou adicione uma função Get) e use-o em B.B não deve herdar de A. Crie o membro BImpl * pBImpl em B e crie foo () e bar () em B, que usarão o pBImpl.Qualquer outra maneira?

O que devo escolher?

questionAnswers(5)

yourAnswerToTheQuestion