2017-09-16 3 views
-1

Ich habe eine Basisklasse und abgeleitete Klasse, zB:entgegengesetzte Operation dynamic_cast

class Base { 
public: 
    Base(); 
    virtual doSomthing(); 
}; 

class Derivative : class Base { 
public: 
    Derivative(); 
    virtual doSomthing(); 
}; 

Ich weiß, dass, wenn ich zur Laufzeit vom Vater auf den Sohn ändern möchten werde ich tun

Derivative& newDer = dynamic_cast<Derivative&>(baseInstance) 

meine Frage ist, wie ich die umgekehrte Operation machen kann - Wechsel vom Sohn zum Vater?

+5

Es ist kein spezieller Cast-Vorgang erforderlich. Der Compiler löst das automatisch auf. – user0042

+1

Was ist der Grund, warum Sie dies tun müssen, eine abgeleitete Klasse hat alle Eigenschaften ihrer Basis. Und normalerweise gibt es eine implizite Umwandlung von abgeleitet zu basisch, die während der Kompilierung stattfindet, wenn Sie einen Zeiger oder eine Referenz auf eine Basisklasse erstellen, aber eine abgeleitete Klasse zuweisen. – Carl

+0

Sie können einfach zuweisen. Ein Derivat ** ist eine ** Base. –

Antwort

2

Es ist kein spezieller Cast-Vorgang erforderlich. Jede Derivative& kann automatisch für einen Base& weitergegeben werden, wenn sie haben wirklich diese Beziehung wie in

class Derivative : public Base { 
       // ^^^^^^ 
public: 
    Derivative(); 
    virtual doSomthing(); 
}; 

Vermeintliche Sie versucht zu tun, dass von einem globalen public Umfang.


meine Frage, wie ich die entgegengesetzte Operation tun kann - Wechsel vom Sohn zum Vater?

Die Vererbungsbeziehung muss im verwendeten Bereich zugänglich sein. Ihr Beispiel hat private Vererbung, und es wird nicht bei public Bereich funktionieren.

As mentioned by @StoryTeller und @Peter es an dem inneren Klasse Derivative Umfang mit jeder Elementfunktion oder friend ed Funktion/Klasse eignet.

+1

Es muss keine öffentliche Basis sein, sondern nur in dem Bereich, in dem die Bindung erfolgt. – StoryTeller

+0

@StoryTeller Funktioniert jedoch nicht mit 'privater' Vererbung. – user0042

+0

Natürlich tut es das. Jede Member-Funktion kann '* this 'an eine Funktion übergeben, die' Base & 'erwartet, um eine Option zu benennen. – StoryTeller