Crie a instância de classe derivada de uma instância da classe base sem conhecer os membros da classe
-
23-09-2019 - |
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.
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
.