2016-04-17 2 views
2

Es ist einfacher, es im Code zu erklären:Warum Konstruktoren, die mithilfe von Deklarationen generiert werden, dieselben Zugriffsebenen für die Basisklassen haben?

class A { 
    protected: 
     A(int i) {} 
     void foo() {} 
    }; 

    class B : public A { 
    public: 
     B() : A(0) {} 
     using A::A; 
     using A::foo; 
    }; 

    int main() 
    { 
     B b1; 
     // [protected] A::foo => [public] B::foo 
     b1.foo(); // Ok 
     // [protected] A::A(int) => [protected] B::B(int) 
     B b2(0); // cannot access protected member 
    } 

habe ich versucht, den Code in VS2015. Ich konnte die Zugriffsebenen von Elementfunktionen mit Deklarationen ändern, während ich das bei Konstruktoren nicht tun konnte. Das ist komisch für mich. Hat jemand eine Idee, warum sie so arbeiten?

Antwort

0

Konstruktoren werden in diesem Fall nicht generiert, sondern vererbt (eigentlich aus einer Basisklasse).
Nach dem documentation, wenn ein Konstruktor vererben:

Es hat den gleichen Zugang wie das entsprechende Basiskonstruktor

Wo Zugangaccess specifiers anzeigt.
Auf der anderen Seite, für die Mitgliedsmethoden:

Verwendung Deklaration stellt ein Mitglied einer Basisklasse in der Klassendefinition abgeleitet sind, wie beispielsweise einem geschützten Teil des Basiselements als öffentliche belichten abgeleiteter.

In diesem Fall kann der Zugriff explizit geändert werden.

Deshalb können Sie die Zugriffsebenen von Elementfunktionen mit Deklarationen ändern, während Sie auf Konstruktoren nicht dasselbe tun können.

+0

Ich weiß immer noch nicht, warum sie es auf diese Weise entwerfen, aber danke für die Informationen. Ich meine, ich kann die Zugriffsebenen immer noch ändern, indem ich Konstruktoren in den Ebenen definiere, die ich in abgeleiteten Klassen haben möchte. Konstruktoren die gleichen Zugriffsebenen wie Basen zu geben, macht es nur weniger nützlich. –

Verwandte Themen