Vererbungsfrage
-
Hallo zusammen,
ich habe ein Problem bei einer Verbungskonstellation mit einer abstrakten Klasse, und sehe gerade den Wald vor lauter Bäumen nicht.
Ich habe einen Klasse T:
namespace qep { class T { public: virtual ~T(); virtual C* createQEP(ast::AST* ast) = 0; protected: T(mm::MM mem); C* createQEP(ast::ASTExpression* ex, ast::ASTFor* forClause); }//End class }//End namespace
Es sei C* createQEP(ast::ASTExpression* ex, ast::ASTFor* forClause); in T.cc implementiert. Weiter habe ich eine Klasse RT:
#include "T.h" namespace qep { class RT : virtual public T { public: RT(mm::MM* mem); ~RT(); }//End class }//End namespace
Diese wird implementiert in RT.cc:
#include "RT.h" namespace qep { RT::~RRT(){ }//End RT::RT(mm::MM* mem) : T(mem) { }//End C* RT::createQEP(AST* ast){ C* prodOp = this->createQEP(ast->getWhereClause(), ast->getForClause()); return new C(ast->getSelectClause(), prodOp, mem); }//End createQEP }//End namespace
Nun bekomme ich folgenden Fehler:
source/qep/RT.cpp:43: Fehler: keine Elementfunktion »qep::C* qep::RT::createQEP(ast::AST*)« in Klasse »qep::RT« deklariert
Warum??? Meine IDE sagt die Methode ist da, der Compiler ist anderer Meinung. Tips? Schonmal dank.
Uwe
-
#include "T.h" namespace qep { class RT : virtual public T { public: RT(mm::MM* mem); ~RT(); C* RT::createQEP(AST* ast);//diese zeile vermisse ich };//und natürlich dieses semikolon //End class }//End namespace
-
Hi volkard,
cool danke. Semikolon war natürlich da. Zeile fehlte aber. Mh. Egal, ein Schritt weiter. Nun meckert er aber (Listing RT.cc[Zeile 12]):
source/qep/RT.cpp:47: Fehler: keine passende Funktion für Aufruf von »qep::RT::createQEP(ast::ASTExpression*, ast::ASTFor*)« source/qep/RT.cpp:43: Anmerkung: Kandidaten sind: virtual qep::QueryCommand* qep::RT::createQEP(ast::AST*)
Diese Methode habe ich aber in T deklariert und definiert, da sie für alle Unterklassen identisch ist. Noch nen Tipp?
Danke schon mal.
Uwe
-
zieh mal die basisklassenmethode in deinen scope rein, damit du unter gleichscopigen funktionen überladung machen kannst, statt im heimatscope den fremden kram nur zu verdecken.
#include "T.h" namespace qep { class RT : virtual public T { public: RT(mm::MM* mem); ~RT(); using T::createQEP; C* RT::createQEP(AST* ast); };//End class }//End namespace
-
Hi volkard,
Zum einen: Was ist dies? Habe ich noch nie gesehen. Warum macht man dies? Und zum andern: Damit bekomme ich den Fehler:
source/qep/T.cpp:490: Fehler: keine Elementfunktion »qep::C* qep::T::creatQEP(ast::ASTExpression*, ast::ASTFor*)« in Klasse »qep::T« deklariert
Das ist die Zeile, in der in der Basisklasse T diese Methode definiert ist. Geht dies Überhaupt in C++? Also nochmal, ich will die Methode createQEP(AST) in den Unterklassen verwenden, aber createQEP(ASTExpression, ASTFor) soll in T definiert sein (da immer das selbe).
Später Gruß und Dank.
Uwe
-
uwerothfeld schrieb:
source/qep/T.cpp:490: Fehler: keine Elementfunktion »qep::C* qep::T::creatQEP(ast::ASTExpression*, ast::ASTFor*)« in Klasse »qep::T« deklariert
mann, da hab ich lange gesucht, um den fehler bei mir zu reproduzieren.
aber wenn ich createQEP auch ohne erstes e schreibe, hab ich auch deinen fehler.
-
Oh man, vorlkard, peinlich peinlich für mich! Dabei sagt er ja sogar was falsch ist. Mh... Danke. Ich bin sehr sehr begeistert. Vielen Dank.
Uwe