Erstellen Sie abgeleitete Klasse Instanz von einer Basisklasse Instanz, ohne die Klassenmitglieder zu wissen

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

Frage

Ist dieses Szenario überhaupt möglich?

class Base
{
  int someBaseMemer;
};

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

  Derived(T* baseInstance);
};

Ziel:

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

Der Wert von pDerived-> someBaseMemer sollte equeal zu pBase-> someBaseMember und ähnliche mit anderen Basiselementen.

War es hilfreich?

Lösung

Warum würden Sie nicht wirklich fertig zu schreiben und Kompilieren des Codes?

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

Dies kompiliert und läuft als Sie angegeben haben.

EDIT: Oder meinst du, dass someNonBaseMemer sollte someBaseMemer gleich

Andere Tipps

Warum würden Sie wollen abzuleiten und den Basiszeiger zur gleichen Zeit passieren? Wählen Sie entweder, nichts hindert Sie daran, die beide. Verwenden Sie Vererbung die Arbeit für Sie tun:

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

Obwohl es nicht die beste Wahl als Design.

Declare someBaseMemr als öffentliches oder die Erklärung zu class von struct ändern:

class Base
{
  public:
  int someBaseMemer;
};

OR

struct Base
{
  int someBaseMemr;
};

Beachten Sie, dass ein class private Zugriff auf alle Mitglieder und Methoden standardmäßig hat. Ein struct bietet public Zugriff standardmäßig aktiviert.

Auch alle abgeleiteten Klassen sollten public Vererbung von Base haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top