überschreiben der virtuellen Funktion nicht immer aufgerufen
eine genauere version der code ist:
class SomeParam;
class IBase
{
public:
virtual void Func(SomeParam* param = NULL)
{
cout << "Base func";
}
};
class DerivedA : public IBase
{
public:
void Func()
{
//do some custom stuff
cout << "DerivedA func";
IBase::Func();
}
};
class DerivedB : public IBase
{
public:
void Func()
{
//do some custom stuff
cout << "DerivedB func";
IBase::Func();
}
};
//at somewhere else
void FuncCaller(IBase *instance1, IBase *instance2)
{
IBase *i1 = instance1;
IBase *i2 = instance2;
i1->Func();
i2->Func();
}
DerivedA *a = new DerivedA;
DerivedB *b = new DerivedB;
FuncCaller(a,b);
Gibt mir:
"Base " func"
"Base " func"
Funktioniert, wie erwartet. Pls überprüfen, die Sie kompilieren die richtige Datei.
Funktioniert gut für mich. Können Sie Ihre ist code?
Ich habe versucht zu kompilieren, das mit Visual Studio 2005 und ich bekomme die erwartete Ausgabe: DerivedA funcBase funcDerivedB funcBase func. Ist genau der gleiche code?
Ich habe den code Bearbeiten, entfernen Sie ein paar Leerzeichen, aber es ist möglich, dass ich geschraubt - kann einer von Euch prüfen in der original-version der Taz veröffentlicht?
nur eine Randnotiz : ich vermute, Sie nennen 'IBase', 'I', weil Sie denken, dass es wie eine Schnittstelle, aber ein interface sollte nur rein virtuelle Methoden.
Funktioniert gut für mich. Können Sie Ihre ist code?
Ich habe versucht zu kompilieren, das mit Visual Studio 2005 und ich bekomme die erwartete Ausgabe: DerivedA funcBase funcDerivedB funcBase func. Ist genau der gleiche code?
Ich habe den code Bearbeiten, entfernen Sie ein paar Leerzeichen, aber es ist möglich, dass ich geschraubt - kann einer von Euch prüfen in der original-version der Taz veröffentlicht?
nur eine Randnotiz : ich vermute, Sie nennen 'IBase', 'I', weil Sie denken, dass es wie eine Schnittstelle, aber ein interface sollte nur rein virtuelle Methoden.
InformationsquelleAutor Taz | 2010-02-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es aus wie Sie haben eine vereinfachte version des Codes, um Sie lesbarer zu machen, aber Sie haben vereinfacht, versehentlich.
Die wahrscheinlichsten Gründe für Ihr Verhalten sind:
FuncCaller()
(siehe quamrana Antwort für die details)const
, während die Funktion der Basisklasse ist nichtconst
EDIT: Nach dem Lesen die Frage bearbeitet, es ist eindeutig der zweite Grund. Sie überschreiben nicht die Funktion der Basisklasse, sondern verstecken Sie in den abgeleiteten Klassen mit einer neuen definition. Sie benötigen, um genau die gleiche Signatur (Kovarianz gilt hier nicht, da die Funktion gibt
void
) in den abgeleiteten Klassen. Im code, müssen Sie entweder:oder
InformationsquelleAutor Gorpik
Ihre virtuelle Funktion nicht überschrieben wird.
Ihre angeblich "virtuelle" Methoden in den abgeleiteten Klassen haben unterschiedliche Signaturen. Die Methode in der Basisklasse hat nur einen parameter, während die Methoden in den abgeleiteten Klassen haben keine Parameter. Weil dieses, die Methoden in den abgeleiteten Klassen sind völlig unabhängig von der Basis-Klasse-Methode. Sie überschreiben nicht die base-Klasse-Methode. Dies ist der Grund, warum die Basisklasse die Methode wird immer aufgerufen wird.
InformationsquelleAutor AnT
Habe ich versucht, eine Kopie von dem code, den Sie geschrieben auf VS2008 und es funktioniert gut.
Kann ich nur empfehlen, dass Sie Ihre aktuelle code ist mehr wie:
wo
FuncCaller
Scheiben die Basis-Teil aus dem abgeleiteten Instanzen.InformationsquelleAutor quamrana
Hab ich den Grund gefunden:
Die überschriebenen virtuellen Funktionen auch muss ein default-parameter wie Base ist.wie:
Danke für die Antworten Jungs.
Func
Signatur entspricht der abgeleiteteFunc
Signatur. Ob die abgeleitete version hat eine Standard-argument spielt überhaupt keine Rolle.Wahr, aber nicht die Festlegung der gleiche Standardwert für alle Parameter wäre schrecklich Praxis.
InformationsquelleAutor Taz