Crie a instância de classe derivada de uma instância da classe base sem conhecer os membros da classe

StackOverflow https://stackoverflow.com/questions/2344910

Pergunta

Esse cenário é possível?

class Base
{
  int someBaseMemer;
};

template<class T>
class Derived : public T
{
  int someNonBaseMemer;

  Derived(T* baseInstance);
};

Meta:

Base* pBase = new Base();
pBase->someBaseMemer = 123; // Some value set
Derived<Base>* pDerived = new Derived<Base>(pBase);

O valor de Pderived-> SomeBaseMemer deve ser equivalente a Pbase-> Somebasemember e semelhante a outros membros da base.

Foi útil?

Solução

Por que você realmente não terminaria de escrever e compilar o código?

class Base 
{ 
public: // add this
    int someBaseMemer; 
}; 

template<class T> 
class Derived : public T 
{ 
public: // add this
    int someNonBaseMemer; 

    Derived(T* baseInstance)
        : T(*baseInstance) // add this
    { return; } // add this
}; 

Isso compila e é executado conforme você especificou.

Editar: Ou você quer dizer que someNonBaseMemer deve ser igual someBaseMemer?

Outras dicas

Por que você gostaria de derivar e passar no ponteiro da base ao mesmo tempo? Escolha também, nada o impede de ter os dois. Use a herança para fazer o trabalho para você:

class Base
{
  public:
    Base(int x) : someBaseMemer(x) {}
  protected:      // at least, otherwise, derived can't access this member
    int someBaseMemer;
};

template<class T>
class Derived : public T
{
  int someNonBaseMemer;

  public:
  Derived(int x, int y) : someNonBaseMemer(y), T(x) {}
};

Derived<Base> d(42, 32); // usage

Embora não seja a melhor das escolhas como design.

Declarar someBaseMemr como público ou mudar a declaração de class para struct:

class Base
{
  public:
  int someBaseMemer;
};

OR

struct Base
{
  int someBaseMemr;
};

Lembre -se disso a class tem private Acesso a todos os membros e métodos por padrão. UMA struct fornece public Acesso por padrão.

Além disso, todas as classes derivadas deveriam ter public herança de Base.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top