Crear instancia de la clase derivada de una instancia de la clase base sin saber los miembros de la clase
-
23-09-2019 - |
Pregunta
¿Es este escenario posible?
class Base
{
int someBaseMemer;
};
template<class T>
class Derived : public T
{
int someNonBaseMemer;
Derived(T* baseInstance);
};
Objetivo:
Base* pBase = new Base();
pBase->someBaseMemer = 123; // Some value set
Derived<Base>* pDerived = new Derived<Base>(pBase);
El valor de pDerived-> someBaseMemer debe ser equeal a pBase-> someBaseMember y similar con otros miembros de base.
Solución
¿Por qué no en realidad se termine de escribir y compilar el 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
};
Esto compila y se ejecuta según lo especificado.
EDIT:? O ¿Quiere decir que debe ser igual someNonBaseMemer
someBaseMemer
Otros consejos
¿Por qué quieres para derivar y pasar el puntero de base al mismo tiempo? Elige bien, nada le impide tener ambas cosas. Uso herencia a hacer el trabajo para usted:
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
Aunque no es la mejor de las opciones como el diseño.
someBaseMemr
declarar como público o cambiar la declaración de class
a struct
:
class Base
{
public:
int someBaseMemer;
};
OR
struct Base
{
int someBaseMemr;
};
Recuerde que un class
tiene acceso private
a todos los miembros y los métodos por defecto. Un struct
proporciona acceso public
por defecto.
Además, todas las clases derivadas debe tener herencia public
de Base
.