Seite 1 von 1

Basisklasse / eigene Klasse als Parameter - Zugriffsrechte

Verfasst: 24.07.2012, 14:13
von kaiserludi
Wieso kompiliert das

Code: Alles auswählen

class FooBase
{
protected:
    void fooBase(void);
};
 
class Foo : public FooBase
{
public:
    void foo(Foo& fooBar)
    {
        fooBar.fooBase();
    }
};
das aber nicht?

Code: Alles auswählen

class FooBase
{
protected:
    void fooBase(void);
};
 
class Foo : public FooBase
{
public:
    void foo(FooBase& fooBar)
    {
        fooBar.fooBase();
    }
};
?

Einerseits darf ich auf die protected (und auch private) Daten eines anderen Objektes zugreifen, sofern es den gleichen Typ hat wie das, von dem aus ich zugreife, andererseits ist das nicht mehr erlaubt, wenn es sich um einen Basistyp des eigenen handelt, was für private verständlich ist, sich mir aber für protected gerade nicht erschließt. Ist das nicht furchtbar inkonsistent?

Habs gerade auf VC++ und ideone.com getestet und beide kompilieren den ersten Code, verweigern beim zweiten aber den Zugriff auf die protected Memberfunktion.

EDIT:
Der Grund ist gefunden - Wenn der zweite Code-Snippet erlaubt wäre, dann könnte ich auch sowas anstellen

Code: Alles auswählen

class FooSibling: public FooBase { };

FooSibling sib;
Foo f;
f.foo(sib); // calls sib.fooBase()!?