Virtuelle Funktion wird in Kindklassen nicht erkannt bei zweiter Funktion mit dem Namen???



  • Hallo!

    Ich habe eine eigene Recordsetklasse (abgeleitet von CRecordset). In dieser Klasse habe ich die Funktion
    C/C++ Code:
    virtual bool Suche(long f_lID);

    Wenn ich jetzt in einer Kindklasse die Funktion
    C/C++ Code:
    long Suche(CString f_strPlz, CString f_strOrt);

    habe, bekomme ich folgenden Fehler:
    Code:
    error C2660: 'Suche' : Funktion akzeptiert keine 1 Parameter

    Wenn ich eine virtuelle Funktion habe, gibt es die doch in allen abgeleiteten Klassen. Funktioniert ja auch bei den Klassen, wo es keine weitere Suche-Funktion gibt.
    Und virtuelle Funktionen bleiben doch "unangetastet" wenn die andere Funktion andere Parameter hat, oder?

    Wo hab ich bei den Grundlagen gepennt? Ich helfe mir momentan durch Einbau einer Dummyfunktion, die nur die Basisklasse aufruft, aber das ist doch idiotisch...

    Danke!

    PS: Ja ich habe MFC Code drin, aber es ist doch ein Grundlagenfehler...
    Und ja, ich hab in zwei Foren gepostet, weil hier hoffentlich die Experten der OOP sitzen. 😃



  • Wenn der Compiler eine Funktion mit passendem Namen gefunden hat, werden die Basisklassen nicht weiter durchsucht. using-Deklaration helfen da weiter.



  • Oh, wie geht das?

    Da fehlen mir wohl wirklich Grundlagen. 😞



  • class Base
    {
    public:
      void f();
    };
    
    class Derived : public Base
    {
    public:
      void f(int);
      using Base::f;
    };
    

    Dann funktionierts. Du mußt auch mit using die Funktionen wieder in den Scope bringen, wenn in Derived die Methoden nur private sind, weil die Zugriffsprüfung erst erfolgt, wenn die Methode schon ausgewählt wurde.

    MfG Jester





  • trotz den hinweisen zum "umgehen" des problems..mit dem scope
    nochmal ein link zu einer kurzen erklärung (nicht mein lieblingtut, aber ok)
    http://www.cpp-tutor.de/cpp/le15/le15_03.htm#ueberschreiben

    vielleicht willst du eigentlich was anderes konstruieren.



  • @Jester + ChrissiB:

    Ich habe das jetzt so gemacht:

    // Suchen und Cursorpositionierung
    	long Suche(CString f_strPlz, CString f_strOrt);
    	//virtual bool Suche(long f_lID); // "Notlösung"
    	using CBasisSetEx::Suche;
    

    Das gibt den Fehler, den ich oben schon geschrieben habe. 😞

    Dann hatte ich noch die Idee, die Basisklasse der Basisklasse anzugeben, also

    // Suchen und Cursorpositionierung
    	long Suche(CString f_strPlz, CString f_strOrt);
    	//virtual bool Suche(long f_lID);
    	using CBasisSet::Suche;
    

    Das gibt dann Fehler, die ich überhaupt nicht mehr verstehe. 😞

    d:\realisierung\views\basis\orteset.h(41) : error C2603: 'CBasisSet' : Zu viele statische Objekte im Blockbereich mit Konstruktoren/Destruktoren in der Funktion
    D:\Realisierung\VIEWS\Basis\AdressSet.cpp(256) : error C2660: 'Suche' : Funktion akzeptiert keine 1 Parameter
    

    Die Klassenhirarchie ist so:
    CRecordset (Aus der MFC)
    |
    v
    CBasisSet
    |
    v
    CBasisSetEx
    |
    v
    COrteSet (das wo der Quelltext draus ist)



  • schnell mal humes vorbild geklaut

    du musst die basisklasse bekannt machen

    #include <iostream>
    class Base
    {
        public:
            virtual bool  suche(long Param)
            {
                std::cout << "Func in Base: " << Param << std::endl;
    			return true;
            }
    		virtual ~Base(){}
    };
    
    class Derived : public Base
    {
        public:
            using Base::suche;	//so rum
            long suche(char Param1, char Param2)
            {
                std::cout << "Func in Derived:" << Param1<<Param2 << std::endl;
    			return 33;
            }
    };
    
    int main()
    {
        Derived d;
        d.suche(5555);
        d.suche('a', 'b');
        return 0;
    }
    


  • Ach, das muss zuerst stehen. 😮

    Boah, nach sowas kann man sich ja tot suchen. 😡

    Danke für deine Geduld. 🙂

    Es kompiliert. 😃



  • schick 🙂


Anmelden zum Antworten