2012-04-08 1 views
0

Possible Duplicate:
c++ virtual function return typeUnterschiedlicher Rückgabewert einer überschriebenen Klasse

Ich habe eine einfache, aber verwirrend Frage hier. Ist es legal, einen anderen Rückgabewerttyp für überschriebene Methoden zu haben als die in der Basisklasse definierten abstact? Ich habe das getan und der Compiler hat sich nicht beschwert ... könnte jemand bitte erklären?

class MyBaseClass 
{ 
    int value; 

public: 
    virtual int getValue() = 0; 
}; 

class MyClass : public MyBaseClass 
{ 
    double value; 

public: 
    virtual double getValue(); // here!!! return is double, not int 
}; 

double MyClass::getValue() 
{ 
    return this->value; 
} 

Der Compiler völlig etwas ähnliches (MSVC und MinGW) akzeptiert ... könnte jemand bitte exaplain in welchem ​​Umfang dies legal ist?

+0

Warum hat Ihre Basisklasse int-Wert, wenn Ihre Unterklasse ein double verwendet? – dexametason

+2

GCC 4.6.1 beschwert: Fehler: widersprüchlicher Rückgabetyp für 'virtuelles Doppel MyClass :: getValue()' – enobayram

+0

Eigentlich in meinem Programm ist es nicht int und double. Es ist doppelt und MathVector mit 3 Komponenten. Die Basisklasse erzeugt ein skalares Signal und die abgeleitete Klasse erzeugt ein 3D-Signal. –

Antwort

2

Der Rückgabetyp darf sich unterscheiden, aber nur in berry-restriktiver Weise und Ihr Code ist illegal. Der Rückgabetyp einer Überschreibung kann sich nur dadurch unterscheiden, dass er kovariant sein kann, wenn der Rückgabetyp der Basis ein Zeiger oder eine Referenz ist. Anders gesagt: Wenn die Basis einen Zeiger oder eine Referenz auf eine Basisklasse zurückgibt, darf die Überlagerung einen Zeiger oder eine Referenz auf eine von der Basis abgeleitete Klasse zurückgeben.

+0

Wie erklären Sie, dass mein Code kompiliert? Die Methode ist sogar rein! Wenn es nicht überschrieben und als neue Methode definiert wird, muss sich der Compiler beschweren, dass die reine Methode nicht verwendet wird !!! Ich bin wirklich verwirrt! –

+0

der Code, den Sie gepostet kompiliert – juanchopanza

+0

In meinem Code habe ich double (in der Basisklasse) und MathVector <3,double> (in der abgeleiteten Klasse, 3 3 Dimensionen), und der Konstruktor von MathVector <3,double> akzeptiert doppelt als Argument. Könnte es sein, dass das Programm automatisch implizite Konvertierungen durchführt, damit es funktioniert? –

0

Überschreiben Sie? Es sieht so aus, als hättest du eine Methode geschrieben und sonst nichts.