Frage zu protected/private Member und Abgeleitet Klasse



  • Guten Abend Leute,

    (weiß nicht genau wie ich den Titel nennen sollte, egal) ich habe folgendes:

    class Base
    {
    protected:
    	void Bar(){}
    };
    
    class Foo : public Base
    {
    	
    	Base* _base;
    	
    	void Do()
    	{
    		_base->Bar();
    	}
    };
    

    Nun bekomme ich den Fehler, dass ich auf Bar nicht zugreifen kann, klar.. aber wenn es eine Klasse tut, welche selbst von Base ableitete, dachte die dürfte es? in C# geht das nämlich soweit ich weiß da !?

    Hoffe ihr verstehet was ich meine;)



  • Nur in der gleichen Instanz. Das düfte in C# genauso sein.



  • @Mechanics sagte in Frage zu protected/private Member und Abgeleitet Klasse:

    Nur in der gleichen Instanz. Das düfte in C# genauso sein.

    Wenn _base ein Foo ist, dann funktioniert das.
    Aber das von SoIntMan gezeigte Beispiel funktioniert auch nicht in C#

    Das hier funktioniert

    class Base
    {
    protected:
    	void Bar(){}
    };
    
    class Foo : public Base
    {
    	
    	Foo* _base;
    	
    	void Do()
    	{
    		_base->Bar();
    	}
    };
    

    Soweit ich das verstehe liegt es daran, dass im Falle eines Base* _base der Compiler nicht wissen kann dass die Instanz, auf die _base zeigt, ein Foo ist. Es könnte auch ein Instanz einer komplett andere Klasse sein.



  • ┌───────────────┬──────────────────────────────────┐
    │  Base class   │       Type of Inheritance        │
    │ member access ├───────────┬────────────┬─────────┤
    │   specifier   │  Public   │ Protected  │ Private │
    ├───────────────┼───────────┼────────────┼─────────┤
    │    Public     │  Public   │ Protected  │ Private │
    ├───────────────┼───────────┼────────────┼─────────┤
    │   Protected   │ Protected │ Protected  │ Private │
    ├───────────────┼───────────┼────────────┼─────────┤
    │    Private    │  hidden   │   hidden   │  hidden │
    └───────────────┴───────────┴────────────┴─────────┘
    


  • @firefly sagte in Frage zu protected/private Member und Abgeleitet Klasse:

    Wenn _base ein Foo ist, dann funktioniert das.

    Aber das ist ja sowieso klar.



  • Ok . danke Euch;) Jetzt komme ich schon zur zweiten Frage:

    Wieso meckert der Compiler nicht in diesem Fall? bzw. wenigsten ne warnung:(

    class Base
    {
    	int _bar;
    };
    
    class Foo: public Base
    {
    	float _bar;
    };
    

    EDIT: liegt es daran , dass durch das Mehrfachvererbung -Konzept so was nicht verweigert werde darf...



  • gcc + clang: -Wshadow



  • @SoIntMan Privates sollte ein Implementierungsdetail sein. D.h. es muss natürlich immer erlaubt sein ein privates Member der Basisklasse mit einem eigenen gleichen namens zu "überdecken". Ich meine das ist sogar in C# erlaubt. Sonst könnte eine Änderung eines Implementierungsdetail die abgeleiteten Klassen brechen.



  • @hustbaer sagte in Frage zu protected/private Member und Abgeleitet Klasse:

    @SoIntMan Privates sollte ein Implementierungsdetail sein. D.h. es muss natürlich immer erlaubt sein ein privates Member der Basisklasse mit einem eigenen gleichen namens zu "überdecken". Ich meine das ist sogar in C# erlaubt. Sonst könnte eine Änderung eines Implementierungsdetail die abgeleiteten Klassen brechen.

    Das stimmt, aber in c# gibts eine warnung.. und man muss mit '"new" den member explizit überschreiben



  • Auch in C# nur, wenn der Member der Basisklasse nicht private ist (also public, protected und/oder internal).

    Du solltest dein C++ Beispiel also mal mit public Membern kompilieren (und entsprechender Warnstufe).


Log in to reply