Mehrdeutigkeit bei Mehrfachvererbung



  • Hi,

    class A {
        private:
                void func() {};
    };
    
    class B {
        public:
                void func() {};
    };
    
    class AB :
            public A,
            public B
    {};
    
    int main()
    {
       AB obj;
       obj.func();
    }
    

    Wieso ist der Aufruf hier Mehrdeutig. Es gibt doch nur eine öffentlich Funktion func() die aufgerufen werden kann. Die private func() sollte doch in main gar nicht sichtbar sein ???

    Wie geht C++ hier bei der Auflösung vor ?



  • Freak_Coder schrieb:

    Wieso ist der Aufruf hier Mehrdeutig. Es gibt doch nur eine öffentlich Funktion func() die aufgerufen werden kann. Die private func() sollte doch in main gar nicht sichtbar sein ???

    Doch. private heißt nicht unsichtbar, sondern dass du nicht zugreifen darfst.

    Freak_Coder schrieb:

    Wie geht C++ hier bei der Auflösung vor ?

    class AB : public A, public B
    {
    public:
        using B::func;
    };
    


  • wenn die basisklassenprogrammierer sich aber entscheiden, an den zugriffsfreiheiiten was zu ändern, darf das auf gar keinen fall die semantik derart verändern, daß schon wieder ne raumfähre abstürzt wegen eines programmierfehlers.



  • .filmor schrieb:

    private heißt nicht unsichtbar, sondern dass du nicht zugreifen darfst.

    Hmm stimmt ja. Das Wort "sichtbar" war blöd gewählt. Aber für den Compiler sollte doch klar sein das ich die Funktion nicht aufrufen darf. Deshalb bleibt doch nur public-func() übrig.

    Also wieso meckert er dann, find ich schon bissl komisch ...



  • Schau dir den Post von volkard an.

    Nehmen wir folgende Hierarchie:

    class Lichtanlagensteuerung
    {
    public:
        void schalte_ab ();
    }
    
    class Antriebssteuerung
    {
    private:
        void schalte_ab ();
    };
    
    class Raumfaehrenelektronik : public Lichtanlagensteuerung, public Antriebssteuerung
    {
    public:
        mache_licht_aus ()
        {
            schalte_ab ();
        }
    };
    

    Was meinst du was das einen Spaß gäbe, wenn das so funktionieren würde, wie du es sagst. Es braucht nur einer zu meinen, die Elektronik bräuchte direkten Zugriff auf den Antrieb, aber, um einen coolen Dimmer einzubauen, keinen direkten Zugriff mehr auf die Funktion, das Licht ganz abzuschalten, schon geht das Licht nicht mehr aus :D.



  • Freak_Coder schrieb:

    .filmor schrieb:

    private heißt nicht unsichtbar, sondern dass du nicht zugreifen darfst.

    Hmm stimmt ja. Das Wort "sichtbar" war blöd gewählt. Aber für den Compiler sollte doch klar sein das ich die Funktion nicht aufrufen darf. Deshalb bleibt doch nur public-func() übrig.

    Also wieso meckert er dann, find ich schon bissl komisch ...

    Ganz und gar nicht !
    Denn die private-Funktion ist mitnichten "nicht aufrufbar" !
    Sie kann nur von außerhalb der Klasse aus nicht aufgerufen werden.

    Beispiel:

    class A {
        private:
                void func() {};
        public:
                void callfunc() {func();}
    };
    
    class B {
        public:
                void func() {};
    };
    
    class AB :
            public A,
            public B
    {};
    int main(void) {
        AB a;
        a.callfunc();
    ...
    

    Welche Funktion soll jetzt aufgerufen werden ?

    Gruß,

    Simon2.



  • .filmor schrieb:

    ...

    Nehmen wir folgende Hierarchie:
    ...

    Dein Beispiel ist ein wenig unglücklich gewählt, weil die private Methode der Basisklasse sowieso nicht von der abgeleiteten Klasse aus aufgerufen werden darf.
    😉

    Gruß,

    Simon2.



  • OK, jetzt ist alles klar 🙂


Log in to reply