Creare un'istanza della classe derivata da un'istanza di classe di base senza conoscere i membri della classe

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

Domanda

E 'questo scenario possibile?

class Base
{
  int someBaseMemer;
};

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

  Derived(T* baseInstance);
};

Obiettivo:

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

Il valore di pDerived-> someBaseMemer dovrebbe essere equeal a pBase-> someBaseMember e simili con altri elementi di base.

È stato utile?

Soluzione

Perché non vuoi finire in realtà la scrittura e la compilazione del codice?

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

Questa compila e viene eseguito come specificato.

EDIT:? O vuoi dire che someNonBaseMemer deve essere uguale someBaseMemer

Altri suggerimenti

Perché si vuole derivare e passare il puntatore base, allo stesso tempo? Scegliere, nulla vi impedisce di avere entrambi. Utilizzare l'ereditarietà per fare il lavoro per voi:

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

Anche se non è la migliore delle scelte come design.

Dichiarare someBaseMemr come pubblico o modificare la dichiarazione da class a struct:

class Base
{
  public:
  int someBaseMemer;
};

OR

struct Base
{
  int someBaseMemr;
};

Ricordate che un class ha accesso private a tutti i membri ed i metodi per impostazione predefinita. Un struct fornisce l'accesso public per impostazione predefinita.

Inoltre, tutte le classi derivate devono avere public eredità da Base.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top