Beim Verweisen auf Referenzen scheint der Compiler die Derived
-Klasse in Base
zu konvertieren und verwendet die benutzerdefinierte Umwandlung überhaupt nicht. Dies funktioniert jedoch tadellos mit Zeigern.Benutzerdefinierte Umwandlung wurde nicht auf Referenzen der abgeleiteten Klasse angewendet
Beispiel:
#include <iostream>
class Base {
public:
int fn() {
return 42;
}
};
class Derived : private Base {
public:
operator Base&() {
return *dynamic_cast<Base*>(this);
}
operator Base*() {
return dynamic_cast<Base*>(this);
}
};
int main() {
Derived d;
Derived &dRef = d;
std::cout<<static_cast<Base&>(dRef).fn()<<std::endl; // <-- error: non-reachable base >>Base<<of>>Derived<<
std::cout<<static_cast<Base*>(d)->fn()<<std::endl; // OK -> "42"
}
Warum ist es nicht möglich, die individuelle wie diese werfen zu benutzen? Ist es möglich, das beabsichtigte Verhalten zu erreichen ("Upcasting" zu einer nicht erreichbaren Basis mit Referenzen)?
Sie werden bemerken, dass Ihre Basisklasse absichtlich * privat * ist, ja? – WhozCraig
@WhozCraig das ist beabsichtigt, deshalb brauchen wir die Besetzung. Es funktioniert jedoch mit Zeigern. – alex
Nun, die erste (die Referenz) würde sowieso nie aufgerufen werden, und Ihr Compiler hätte Sie davor warnen müssen: clang, zum Beispiel: "Konvertierungsfunktion, die 'Derived' in seine Basisklasse 'Base' konvertiert, wird niemals benutzt werden". – WhozCraig