Ich habe ein ziemlich seltsames Verhalten bei der Verwendung von Auto und Dynamic_cast aufgetreten. Dies ist die Klasse Hierachie ich habe:dynamische Besetzung eine Referenz und Auto
class BaseInterface {
public:
virtual void someMethod()=0;
};
class Derived:public BaseInterface {
public:
virtual void someMethod1()=0;
void someMethod()override;
};
Und natürlich gibt es einige Klassen, die alle abgeleiteten Methoden implementieren.
Dann gibt es eine dritte Klasse, die wie folgt aussieht:
class ThirdClass {
public:
void demoMethod(BaseInterface&);
void anotherMethod(Derived&);
};
void ThirdClass::demoMethod(BaseInterface& obj) {
auto buffer=dynamic_cast<Derived&>(obj);
anotherMethod(buffer);
}
Wenn ich kompilieren dies mit gcc Ich erhalte eine Fehlermeldung „kann ein Objekt nicht von abstrakten Typ zuweisen“. Während, wenn ich
ersetzenauto buffer=...
mit
Derived& buffer=...
alles kompiliert in Ordnung. Warum ist das der Fall? Erkennt Auto nicht den richtigen Typ oder etwas?
Auch fand ich einen schmutzigen Trick noch Auto benutzen:
void ThirdClass::demoMethod(Base& obj) {
auto buffer=dynamic_cast<Derived*>(&obj);
anotherMethod(*buffer);
}
Ich denke, 'auto' leitet den Typ' Derived buffer' ab, nicht 'Derived & buffer'. – melpomene
Welche Version von g ++ verwenden Sie? Funktioniert gut, um Ihren Code zu kompilieren [nach der Korrektur von Trivial-Tippfehlern wie z. B. kein Rückgabetyp auf 'demoMethod' und keine Vererbung auf' derived'] - sowohl clang ++ 3.7 (etwa zwei Wochen alt) als auch g ++ 4.9.2. –
@MatsPetersson: Wenn der fehlende Rückgabetyp behoben ist, schlägt er in der beschriebenen Weise mit dem Compiler, den Ideon verwendet, fehl: http://ideone.com/UEtfui –