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


Log in to reply