class baseObject {}; class Object : public baseObject {};
class base { virtualconst baseObject **get_objects() const; };
class A : public base { virtualconst Object **get_objects() const; };
Nun bekomme ich folgenden Fehler wenn bei class A::get_objects das "const" hinten dran ist:
Code:
layer.hpp:353: error: conflicting return type specified for 'virtual const Object** A::get_objects() const' layer.hpp:115: error: overriding 'virtual const baseObject** base::get_objects() const'
Wenn ich das "const" nur bei class A::get_objects hinten weglasse, kompiliert es, nur kann ichs dann logischerweise nicht mehr in ner konstanten instanz der Klasse verwenden.
Wie löst man das am geschicktesten? -- class God : public ChuckNorris { };
Wenn du den Rückgabetyp ändern willst, ist das kein Fall für Polymorphie. Vermutlich hast du einen Entwurfsfehler gemacht, aber um das nachzuvollziehen, müsste man wissen, was baseObject, Object, base und A sind.
hi, dem standard nach kann man das ja. Hab gerade rausgefunden das, wenn man nur einen "einfachen" pointer zurückgibt (jeweils) funktioniert das ganze so wies oben steht. Nur ich brauch ich eben den Pointer auf das Array. -- class God : public ChuckNorris { };
class baseObject {}; class Object : public baseObject {};
class base { virtualconst baseObject *get_objects() const; };
class A : public base { virtualconst Object *get_objects() const; };
Das geht bei mir auch nicht. Gleicher Fehler:
Code:
getobjects.cpp(11) : error C2555: 'A::get_objects' : overriding virtual function differs from 'base::get_objects' only by return type or calling convention
Compiler: MS VC++ 6
Was ich meinte, ist: Du hast vielleicht die Klassenbeziehungen falsch abgebildet. Ich versuche mal ein Beispiel, was hoffentlich nicht zu sehr hinkt:
C++:
class Bein {}; // allgemeines Bein class Elefantenbein : public Bein {}; // besonderes Bein
class Tier { virtualconst Bein ** get_Beine () const; };
class Elefant : public Tier { virtualconst Elefantenbein ** get_Beine () const; };
Erkennst du, dass Elefant::get_Beine eine ganz andere Methode ist als Tier::get_Beine? Und eine andere Tierart (z.B. Giraffe) hat wieder andere Beine. Bei diesem Ansatz ist get_Beine nicht polymorph, also ist die ganze virtual-Geschichte hier nicht angebracht.
aoDieser Post wurde am 07.11.2006 um 09:23 Uhr von ao editiert.
ao, was für einen alten (nicht standard-konformen) Compiler benutzt DU denn ?
Das was FloSoft geschrieben hat (mit einfachen Pointern) funktioniert und ist so im Standard definiert (overriding with dependant class pointer), aber dies ist ja eher für Create-Methoden gedacht (und nicht für Getter-Methoden).
Ich denke auch, ein Redesign wäre hier angebracht (vllt. doch lieber templates statt dynamische Containerklassen verwenden?)
Hab gerade rausgefunden das, wenn man nur einen "einfachen" pointer zurückgibt (jeweils) funktioniert das ganze so wies oben steht.
Das ist richtig. Darum ist Dein Problem auch kein const-Problem. Wenn Du das const in Deinem ersten Beispiel an einer der get_objects() Funktionen weglässt, ist es einfach eine andere Funktion als die virtuelle der Basisklasse. -- Reden ist Schweigen und Silber ist Gold.