Basisklasse / eigene Klasse als Parameter - Zugriffsrechte

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Basisklasse / eigene Klasse als Parameter - Zugriffsrechte

Beitrag 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()!?
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Antworten