Créer dérivé instance de classe d'une instance de classe de base sans connaître les membres de la classe
-
23-09-2019 - |
Question
Est ce scénario possible?
class Base
{
int someBaseMemer;
};
template<class T>
class Derived : public T
{
int someNonBaseMemer;
Derived(T* baseInstance);
};
Objectif:
Base* pBase = new Base();
pBase->someBaseMemer = 123; // Some value set
Derived<Base>* pDerived = new Derived<Base>(pBase);
La valeur de pDerived-> someBaseMemer doit être equeal à pBase-> someBaseMember et similaires avec d'autres éléments de base.
La solution
Pourquoi ne pas finir en fait écrire et compiler le code?
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
};
Cette compile et fonctionne comme indiqué.
EDIT: Ou voulez-vous dire que someNonBaseMemer
doit être égal someBaseMemer
Autres conseils
Pourquoi voudriez-vous tirer et passer le pointeur de base en même temps? Choisissez soit, rien ne vous empêche d'avoir les deux. Utilisez l'héritage pour faire le travail pour vous:
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
Bien que pas le meilleur choix que la conception.
Déclarer someBaseMemr
en public ou modifier la déclaration de class
à struct
:
class Base
{
public:
int someBaseMemer;
};
OR
struct Base
{
int someBaseMemr;
};
Rappelez-vous qu'un class
a accès private
à tous les membres et les méthodes par défaut. Un struct
offre un accès public
par défaut.
En outre, toutes les classes dérivées devraient avoir l'héritage de public
de Base
.