Creare un'istanza della classe derivata da un'istanza di classe di base senza conoscere i membri della classe
-
23-09-2019 - |
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.
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
.