Créer dérivé instance de classe d'une instance de classe de base sans connaître les membres de la classe

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

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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top