Code: Alles auswählen
class FooBase
{
protected:
void fooBase(void);
};
class Foo : public FooBase
{
public:
void foo(Foo& fooBar)
{
fooBar.fooBase();
}
};
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()!?