2017-11-28 1 views
18

Ich bin mit privatem Erbe, und ich bin überrascht, dass in der abgeleiteten Klasse Verwendung jeden Basis Objekts zu sehen, ist nicht erlaubt.Keine Verwendung von Objektbasis in privaten Vererbung erlaubt

class A; 
class B : private A; 
class C : public B; 

C::method_1() 
{ 
    A* a; // Temporary "A" object for local computation 
} 

Das hat nichts mit Vererbung zu tun. Ich möchte nicht auf this->base method zugreifen!

Diese Konfiguration bietet einen C2247-Fehler in Visual Studio ("'A' nicht zugänglich, weil 'B' 'private' verwendet, um von 'A' zu erben). diese

+9

Try ':: A * a;' statt 'A * a;' –

+3

Mögliche Duplikat von [Wie wird eine statische Methode von einer privaten Basisklasse aufgerufen?] (https://stackoverflow.com/questions/39349998/how-to-call-a-static-method-from-a-private-base-class) –

Antwort

23

Wechsel:

A* a; 

dazu:

::A* a; 

seit C erbt von B und B von A, so müssen Sie den Bereichsauflösungsoperator den Trick zu tun.

Anstatt mit dem lokalen Bereich zu starten, der die Klasseneltern enthält, beginnt ::A mit Blick auf den globalen Gültigkeitsbereich wegen der ::.

Vom Standard:

11.1.5 Acess Specifiers

In einer abgeleiteten Klasse, die Suche eines Namens Basisklasse finden die injiziert-Klasse-Name anstelle des Namens der Basisklasse im Bereich , in dem es deklariert wurde. Der Name der Klasse injected-class ist möglicherweise weniger als zugänglich als der Name der Basisklasse in dem Bereich, in dem deklariert wurde.

+0

Ich verstehe nicht wirklich die Bedeutung des Scope-Operators in diesem Fall aber es funktioniert gut. Vielen Dank ! –

+1

@GuillaumeDespine: Anstatt mit dem lokalen Gültigkeitsbereich zu beginnen, der die Klasseneltern enthält, beginnt ':: A' mit dem Blick auf den globalen Gültigkeitsbereich wegen des' :: '. –

+1

ISO: 11.1 Zugriffsbezeichner: [Anmerkung: In einer abgeleiteten Klasse findet die Suche nach einem Basisklassennamen den Namen der injizierten Klasse anstelle des Namens der Basisklasse in dem Bereich, in dem sie deklariert wurde. Der Name der Klasse, auf die injiziert wurde, ist möglicherweise nicht zugänglich als der Name der Basisklasse in dem Bereich, in dem sie deklariert wurde. -end note] Hat dasselbe Beispiel –

15

ISO C++: 11.1 Zugriffsbezeichner

5 [Anmerkung: In einer abgeleiteten Klasse, die Suche eines Namens Basisklasse wird die injizierte-Klasse-Name anstelle des Namens der Basisklasse fi nden in dem Umfang, in dem es erklärt wurde. Der Name der injected-Klasse ist möglicherweise weniger zugänglich als der Name der Basisklasse in dem Bereich, in dem sie deklariert wurde. -Ende note]

Und das Beispiel von der Norm:

class A { }; 
class B : private A { }; 
class C : public B { 
    A* p; // error: injected-class-name A is inaccessible 
    ::A* q; // OK 
}; 

N3797 Working Draft, Standard for Programming Language C++

+1

Dies könnte ärgerlich werden, wenn diese Klassen alle in einem verschachtelten Namespace sind –

Verwandte Themen