Erstellen Sie abgeleitete Klasse Instanz von einer Basisklasse Instanz, ohne die Klassenmitglieder zu wissen
-
23-09-2019 - |
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.
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.