Hier ist meine Codes in der Datei source.cpp:Wie greift die Freundesklasse der Basisklasse auf Mitglieder dieser Basisklasse über Objekte der Klasse zu, die von der Basisklasse abgeleitet sind?
class B
{
friend class F;
protected:
int protectedIntB;
};
class D : public B {};
class F
{
public:
int f(D &d) {return ++d.protectedIntB;}
};
Wenn ich oben Codes mit g++ -c -Wall -pedantic -std=c++11 source.cpp
und cl /c source.cpp
kompilieren, kompilieren beide Compiler erfolgreich. Allerdings, wenn ich machen erbt D von B protected
statt public
mit:
class D : protected B {};
Diesmal gcc erfolgreich kompiliert, während cl ein Fehler gibt, sagt, dass B::protectedIntB
in return ++d.protectedIntB;
unzugänglich ist.
Eine andere Situation public
mit private
ersetzt:
class D : private B {};
Dieses Mal, ergeben beide Compiler-Fehler. Übrigens benutze ich gcc Version 5.3.0 von mingw-w64 und cl Version 19.00.24210 von VS2015.
Hier kommt meine Frage:
Wie Freund Klasse der Zugriffsbasisklasse Mitglieder dieser Basisklasse durch Objekte der Klasse von der Basisklasse abgeleitet ist, und warum gcc und cl es anders behandeln?
Edit:
Dank songyuanyao und Brian, so scheint es einen Fehler in gcc 5.3.0 im protected
Fall. Nur der public
Fall sollte erfolgreich kompiliert werden, und gcc 6.1.0 funktioniert auch gut.