Diese Frage betrifft das Überschreiben einer virtuellen Methode in einer abgeleiteten Klasse mit einem anderen Rückgabetyp. Für den folgenden Code:Fehler beim Zurückgeben eines abgeleiteten Klassenzeigers beim Überschreiben einer virtuellen Methode
class father {
public:
virtual father* ref() { return this; }
};
class child : public father {
virtual child* ref() { return this; }
};
Wenn ich versuche, direkt einen Zeiger zu erhalten, g ++ (F15, g ++ 4.5) berichtet, "ungültige Umwandlung von Vater zu Kind"
child m_child;
father* pf = &m_child;
child* pc = pf->ref();
verstehe ich die ref() -Methode in der Kindklasse wird verwendet und dies ist wahrscheinlich nur ein Fehler bei der Kompilierungszeit.
Gibt es jedoch eine Möglichkeit, dies ohne explizite Verwendung eines Typcast zu tun?
Zusätzliche Beschreibung: Ich verstehe den Grund, warum Compiler diesen Fehler melden. Was ich brauche, ist etwas aus der Box, das auf die Daten in abgeleiteten Objekten zugreifen kann, ohne explizit einen Zeiger zu konvertieren.
Die Vaterklasse wird verwendet, um verschiedene abgeleitete untergeordnete Objekte in Listen oder Vektoren einzufügen. Wenn also ein Element aus der Liste oder dem Vektor abgerufen wird, kann nicht angegeben werden, welcher Kindklasse es angehört.
Ich habe interne Methode zum Aufzeichnen und Überprüfen der Kindklasse Typ. Aber ich möchte den Zeiger nicht explizit konvertieren.
Zum Beispiel würde Ich mag so etwas tun:
// assuming pf is pointer pointed to an item fetch from a vector
switch(fp->get_type()) {
case child_type1: fp->ref()->list1.push(data); break;
case child_type2: fp->ref()->list2.push(data); break;
case child_type3: fp->ref()->list3.push(data); break;
}
Gerade jetzt, ich brauche eine neue Variable explizit erklären oder explizit fp auf die richtige Art jeweils konvertieren und jedes Mal, wenn ich brauche Zugriff auf Daten in abgeleiteten Klassen, die mühsam und verwirrend sind.
Was ich erwarte sind: kann einige Boost-Bibliotheken können ähnliche Dinge auf eine andere Weise tun, die ich noch nicht weiß, oder kann die C++ 11 Standard erlaubt es aber eine spezielle Compiling-Parameter gesetzt werden muss?
Ich glaube ich verstehe es sehr gut, warum der Compiler einen Typenkonflikt meldet. Was ich brauche, ist keine Erklärung darüber, was hier passiert. Ich brauche etwas aus der Box. Um es weiter zu erklären, sehen Sie bitte die zusätzliche Beschreibung hinzugefügt. –