2017-09-19 4 views
1

Ist es möglich, einen Referenz-Cast in C++ zu überladen?Überladen einer C++ - Referenzübersetzung (Downcasting-Vererbung)

Ich habe Code habe ich nicht im Format berühren:

void someMethod(Parent& parentReference, ...){ 
    ... 
    Child& child = static_cast<Child&>(parentReference); 

(Die Klasse Kind erbt direkt und öffentlich aus der Klasse Parent)

Ich mag würde das Verhalten anpassen von dieser Besetzung - Ich kann die Klasse Child ändern.
Ich habe versucht, wie so den Cast-Operator Überlastung:

Parent::operator Child&(){ 
    ... 

Aber diese Methode nie aufgerufen wird.

Ich frage mich, ob das überhaupt möglich ist?

EDIT
Per R Sahu, ich bin in diesem Szenario der Nähe: https://timsong-cpp.github.io/cppwp/n3337/expr.static.cast#2

struct B { }; 
struct D : public B { }; 
D d; 
B &br = d; 

static_cast<D&>(br);   // produces lvalue to the original d object 

dass außer, statt einfach von B &br = d; Zuweisung br als Argument der Methode kommt, und ist zuvor über das Netzwerk gesendet (als NML).

Dies wäre das Szenario:

struct B { }; 
struct D : public B { 
    int a; 
    int b 
}; 

D d; 
d.a = x; 
d.b = y; 

server.send(d); 

... 

client.receive(msg); 

receive(B& msg){ 

    D& msgD = static_cast<D&>(msg); 

} 

msgD.x und msgD.y kommen über den Draht und korrekt rekonstruiert. Ich möchte jedoch die Art ändern, wie sie rekonstruiert werden, ohne die receive Methode zu ändern. Ist das möglich?

+1

Wenn Sie 'Parent' nicht ändern können, sollte der Compiler Sie nicht einmal definieren lassen: 'Parent :: operator Child &()'. – Brian

+1

Mögliches Duplikat von [Ist es möglich, den Operator \ * static \ _cast \ * zu überladen?] (Https://stackoverflow.com/questions/8432651/is-it-possible-to-overload-the-static-cast- Operator) –

+0

@Brain - ja, das war ein Fehler - ich habe entsprechend bearbeitet. Ich kann Eltern ändern. – fatman

Antwort

0

Da Klassen

struct Parent 
{ 
}; 

struct Child : Parent 
{ 
}; 

static_cast<Child&> keine benutzerdefinierte Konvertierungsfunktion verwenden.

Von 5.2.9 Static cast/2

einen L-Wert vom Typ „CV1 B“, wobei B ein Klasse-Typ ist, kann gegossen werden „Bezugnahme auf CV2 D“ auf dem Typ, wo D eine Klasse von B abgeleitet werden, wenn es existiert eine gültige Standardkonvertierung von "Zeiger zu D" zu "Zeiger auf B", cv2 ist die gleiche cv-Qualifikation wie cv1 oder höher als cv1, und B ist weder eine virtuelle Basisklasse von D noch eine Basisklasse einer virtuellen Basisklasse von D. Das Ergebnis hat den Typ "cv2 D."

und dann gibt es die "sonst" -Klauseln in 5.2.9 Static cast/4 und 5.2.9 Static cast/5.

Meine Interpretation der oben genannten ist, dass seit Child eine Unterart von Parent ist, gelten die obigen Klauseln 4 und 5 nicht.

+0

Dann wie kommt 'Kind child3 = static_cast (Eltern);' Anrufe 'Eltern :: Operator Kind &() {...' – fatman

+2

@Fatman, aktualisierte ich die Antwort nur ein bisschen. 'static_cast ' ist anders als 'static_cast '. –

+0

@R Sahu - vielen Dank für die Antwort - es half mir, genau zu beleuchten, was ich zu tun versuche. Ich habe mehr Details zu meiner Frage oben hinzugefügt. – fatman