2010-02-26 2 views
5

Ist dieses Szenario überhaupt möglich?Erstellen einer abgeleiteten Klasseninstanz aus einer Basisklasseninstanz, ohne die Klassenmitglieder zu kennen

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 pDerived-> someBaseMemer sollte pBase-> someBaseMember und ähnliche mit anderen Basiselementen equeal sein.

+3

Warum willst du so ein verzerrtes Ding? – GManNickG

+0

StackOverflowException? LOL .... Auf eine ernsthafte Anmerkung ... das wird nicht kompilieren. –

+0

@Elite: Eigentlich wird es, wenn Sie die Mitglieder ändern, öffentlich zu sein. Macht es aber nicht weniger erschreckend. –

Antwort

3

Warum sollten Sie den Code nicht schreiben und kompilieren?

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 wie von Ihnen angegeben.

EDIT: Oder meinst du, someNonBaseMemer sollte gleich someBaseMemer?

+0

Abgeleitet (T * baseInstance): T (* baseInstance) ist die Lösung.Ich habe versucht T (BaseInstance) und blieb auf den Compiler-Fehler. Compiler Fehlermeldungen mit Vorlagen z. SomeClass :: NestedClass :: Blabla gib mir die Gänsehaut. Vielen Dank. –

+0

Es gab eine weitere gute Antwort hier, wurde aber gelöscht. Ich weiß nicht warum. Abgeleitet (const T & baseInstance): T (baseInstance) war auch ein guter Hinweis, aber nicht für meinen speziellen Fall. Beispiel in meiner Frage ist nur ein kleines Stück von etwas größerem Zeug. –

4

Warum möchten Sie den Basiszeiger zur gleichen Zeit ableiten und übergeben? Wählen Sie entweder, nichts hält Sie davon ab, beides zu haben. Verwenden Sie die Vererbung, um die Arbeit für Sie zu erledigen:

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 nicht die beste Wahl als Design.

+0

Es überrascht mich, wie eifrig Leute sind, um zu antworten, die den Punkt verfehlen. Was ist der Sinn eines Derived (int, int) -Konstruktors, wenn die Base-Klasse mehr Mitglieder hat? In Ihrem Beispiel wäre die Klasse Abgeleitet: öffentliche Basis besser, da die abgeleitete Klasse die Mitglieder der Basisklasse erkennen muss. Aber es beantwortet meine Frage immer noch nicht. –

+1

Sie vermissen meinen Punkt leider leider, was darin bestand, den Compiler das Kopieren machen zu lassen. Ihr Beispiel ist ein Durcheinander - das hilft Ihnen überhaupt nicht, Ihren Standpunkt klar zu machen. – dirkgently

+0

Glücklicherweise war jemand in der Lage mein Chaos zu verstehen und meine Frage zu beantworten. –

1

Declare someBaseMemr als öffentliche oder die Erklärung class-struct ändern:

class Base 
{ 
    public: 
    int someBaseMemer; 
}; 

OR 

struct Base 
{ 
    int someBaseMemr; 
}; 

Denken Sie daran, dass ein class standardmäßig private Zugriff auf alle Mitglieder und Methoden hat. A struct bietet standardmäßig public Zugriff.

Außerdem sollten alle abgeleiteten Klassen public Vererbung von Base haben.

+0

Die Technik des Posters ist ein Muster, das es ermöglicht, Basisklassen oder den Ableitungspfad der abgeleiteten Klasse zu ändern. Ich habe diese Technik auch benutzt. –

Verwandte Themen