Virtuelle Methode überladen, nicht implementieren



  • Hallo,

    ich implementiere in einer Klasse A eine virtuelle Methode foo(Datatype01*). Von dieser Klasse leite ich eine andere Klasse B ab und möchte in ihr die Methode foo überladen, wie im angehängten Code gezeigt mit einem anderen Datentyp, also foo(Datatype02*).
    Kompiliere ich so, sagt mir der Compiler "function A::foo(Datatype01 😉 is hidden by B::foo, virtual function override intended?". Ja, ich will die Methode überladen aber wie mache ich das?
    Füge ich noch die Zeile

    using A::foo;
    

    in B.h vor

    virtual void foo(Datatype02* pData);
    

    ein, so sagt mir der Compiler auch, dass A::foo keinen Overrider hat ...
    Darum die prinzipielle Frage: Kann man virtuelle Methoden überladen? (also nicht nur implementieren)
    Wenn ja, wie? bzw. was mache ich falsch?

    Ich bin für jede Hilfe dankbar und hoffe mein Problem ausführlich genug geschildert zu haben.

    A.h)
    
    class A{
    
    	A();
    	~A();
      	virtual void foo(Datatype01* pData)=0;
    };
    
    A.cpp)
    
    A::A(){};
    A::~A(){};
    
    B.h)
    
    class B : public A {
    
    	B();
    	~B();
    	virtual void foo(Datatype02* pData);
    
    };
    
    B.cpp)
    
    	B::B(){}
    	B::~B(){};
    	void B::foo(Datatype02 *pData){
    
    	//do something
    
    	}
    
     main(){
    
          B *test = new B();
          test->foo (new Datatype02());
     }
    

    VG

    raffi007



  • die zu überschreibende fkt sollte schon die gleiche signatur haben, wie die, mit der sie überschrieben wird...
    also: das mit dem datatype01 vs datatype02 solltest du iwie in den griff bekommen ^^
    vll dort (auch) mit polymorphie arbeiten und ne basisklasse übergeben...

    bb



  • du musst in B die ursprüngliche Methode von A implementieren, ganz egal ob du dazu noch eine Überladung anbietest oder nicht. Was soll sonst passieren wenn jemand über einen Pointer (oder referenz) auf A auf ein B zugreift und foo(Datatype01*) aufruft?
    Ich hab hier die sachte Vermutung dass du da irgendwo einen Denk- und Designfehler hast. Deshalb mal wieder die Standardfrage: was willst du erreichen? (sprich, welches Problem modellieren deine Klassen?)



  • Hallo,

    danke euch beiden für die schnellen Antworten! 🔝

    A ist ein dispatcher auf Netzwerkebene, die über eine Methode (foo) Nachrichten vom Typ Datatype01 von darunterliegenden Schichten empfängt. Der davon abgeleitete dispatcher auf Application-Ebene soll ebenso Nachrichten empfangen können. Nur sind diese Nachrichten vom Typ Datatype02 komplett anders (Datatype01 abzüglich Headerinfo, also die payload von Datatype01), als Datatype01. Naja, vielelicht muss ich schlichtweg doch eine abstrakte Basisklasse für beide Typen implementieren.

    Mich hat vor allem interessiert, ob ich so dermaßen auf dem Schlauch stehe und die offensichtliche Lösung nicht erkenne.
    Die Aussage, dass ich "die ursprüngliche Methode von A implementieren, ganz egal ob du dazu noch eine Überladung anbietest oder nicht", bestätigt michin meiner Vermutung.

    Hatte gehofft, das Problem auf andere Art und Weise lösen zu können.

    Danke für die Hilfe!



  • naja deiner beschreibung nach würd ich eine Basisklasse machen udn sowohl A als auch B davon ableiten. für deine ReceiveData-Methode gibts dann verschiedene Möglichkeiten, je nachdem:

    - Wenn du das Datenverschicken polymorph über die Basisklasse regeln willst, deklarierst du die Methode abstrakt in der Basisklassi mit einem void* oder char* (char-array) als Parameter. Die jeweilige konkrete abgeleitete Klasse muss den Pointer dann umcasten udn weiß selbst wie es die rohen Daten interpretieren soll.
    - Die andere Möglichkeit ist, dass das Modul, das die RecieveData-Methode aufruft, weiß um welche Klasse es sich genau handelt, dann braucht die Basis keine Methode, denn dann hat das entsprechende Modul ja einen konkreten Pointer auf A bzw. B, und die beiden Klassen können die Receive-Methoden unabhängig voneinander deklarieren.



  • Ok, hab ich verstanden, danke sehr!


Anmelden zum Antworten