Ich habe den folgenden Code:
%Vor% NestedBase
class ist eine private geschachtelte Klasse von Base
, daher scheint es, dass Zeile B nicht kompiliert wird. Andererseits hat die Variable b
das öffentliche Mitglied nested
, und ich kann ihre Methode Do()
von außerhalb von Base
aufrufen (wie in Zeile A). Welche genauen Regeln regeln den Zugriff auf die private geschachtelte Klasse (oder ihre Mitglieder) in einem solchen Fall? Was sagt der Standard dazu?
Gemäß dem Standard $ 11.7 / 1 Geschachtelte Klassen [class.access.nest] :
Eine verschachtelte Klasse ist ein Mitglied und hat als solches die gleichen Zugriffsrechte wie jedes andere Mitglied.
Also, es ist ziemlich einfach. NestedBase
ist ein private
Mitglied der Klasse Base
, daher kann Base::NestedBase
nicht in main()
aufgerufen werden.
b.nested.Do();
ist in Ordnung, weil nested
und Do()
beide public
-Member sind. Die Tatsache, dass NestedBase
eine private
geschachtelte Klasse von Base
ist, spielt keine Rolle, ist hier irrelevant.
Der Typname NestedBase
ist ein privates Mitglied der Klasse.
Sie können also nicht explizit außerhalb der Klasse, in der der Name deklariert ist, darauf zugreifen.
Aber Sie können den Namen implizit folgendermaßen aufrufen:)
%Vor%Tags und Links c++ inner-classes class-visibility