Crear instancia de la clase derivada de una instancia de la clase base sin saber los miembros de la clase

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

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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top