Frage zur Methodenüberladung?



  • Hi,

    hätt da ein kleines Problem und ich werd da im Augenblick nicht wirklich schlau draus

    Ich hab zwei Methoden, die eine im Publicteil die andere im Protected. Abgeleitete Klassen sollen auf das Dataobject schreiben zugreifen können, andere nur lesend ( Dataobject ist an die klasse protected vererbt worden )

    Nu is es so, dass wenn ich
    std:string name = myclass.GetData().mObjectName ;

    aufrufe,
    dass er nicht auf die Methode zugreifen kann, da sie protected ist ..... 😕 obwohls ja eine geben würd die ja eigentlich funktionieren sollt

    Kann ich genau diese Form der Überladung nicht machen oder muss ich beim Aufruf dann noch etwas zusätzlich machen?

    public:
        const DataObject& GetData( void ) const throw()
        {
          return reinterpret_cast< const DataObject& >( *this ) ;
        }
    
    protected:
        DataObject& GetData( void ) const throw()
        {
          return reinterpret_cast< DataObject& >( *this ) ;
        }
    

    was ich vergaß zu sagen
    ich benutzte Visual Studio v 6 sp 3



  • Hallo,

    wird das uebersetzt? Polymorphie funktioniert doch nicht ueber den Rueckgabewert.

    mfg
    v R



  • als ich die klasse erstellt habe hatte ich schon so meine zweifel aber die klasse wird übersetzt, ohne irgend ein warning etc.

    Nur wenn ich die methode aufrufe ...... dann krachts halt. Gut mir is klar ich könnte es ganz einfach lösen in dem ich die Public-Methode in GetDataReadOnly oder so umbenenn ..... micht interessiert halt warum einerseits die Klasse korrekt übersetzt wird aber andererseits, ich sie nicht benutzen kann. Es scheint so als ob die Protected Methode die public Methode überschreibt.



  • Der Code ist in der Tat fragwuerdig, dazu will ich aber gar nichts weiter sagen. Allgemein gilt, dass Ueberladung und Sichtbarkeit getrennt behandelt werden. Zuerst waehlt der Compiler die passende Funktion aus, und dann erst prueft er, ob der Zugriff gueltig ist.



  • nachdem sich schlussendlich meine Zweifel doch bestätigt hatten .... dass es so nicht geht, werde die Methoden einfach unterschiedlich benannt und die sache ist erledigt.

    wollt nur wissen warums so ist.

    @Bashar, Realisticer
    Und danke an euch beide, für den kleinen Nachhilfeunterricht 😉



  • public:
        const DataObject& GetData( void ) const throw()
        {
          return reinterpret_cast< const DataObject& >( *this ) ;
        }
    
    protected:
        DataObject& GetData( void ) const throw()
        {
          return reinterpret_cast< DataObject& >( *this ) ;
        }
    

    hauptproblem sollte doch sein,d ass beide mthoden const sind, dh sie unterscheiden sich von der signatur absolut nicht. mach bei der 2.d as const weg, dann sollte es klappen.



  • Yep, schau dir mal operator [] Implementationen an, da wird das auch oft so gemacht, einmal const-Referenz und einmal non-const-Referenz.



  • @otze, groovemaster:
    Lest Bashars Beitrag nochmal - dann versteht ihr, warum das keine Lösung ist.



  • Ja, nur leider wählt der Compiler nicht die richtige Funktion aus. Das ist aber ein bekanntes Problem. Wenn ich schreibe

    a = b + c();
    

    und Funktion c gibt die Referenz zurück (überladen als const und non-const Funktion) wird die non-const Funktion aufgerufen, obwohl imo die const richtiger wäre. Man kann sich dann aber mit einer Klasse, die die Lesefunktionalität über operator T() und die Schreibfunktionalität über operator =() realisiert, behelfen.


Log in to reply