2014-01-09 8 views
28

Unter der Annahme, der folgenden Aufbau:C++ 11 Vererbungs Konstrukteuren und Zugriffsmodifikatoren

class Base 
{ 
protected: 
    Base(P1 p1, P2 p2, P3 p3); 

public: 
    virtual void SomeMethod() = 0; 
} 

class Derived : public Base 
{ 
public: 
    using Base::Base; 

public: 
    virtual void SomeMethod() override; 
}; 

Sollte ich in der Lage sein Derived ‚Konstruktor als öffentliche hier angeben? VC++ gibt den folgenden Fehler:

d. H. Es ignoriert den Zugriffsmodifizierer über dem geerbten Konstruktor.

Ist dies eine Einschränkung der Funktion? Es macht keinen Sinn für die Klasse Base einen öffentlichen Konstruktor zu haben, da sie niemals direkt instanziiert werden kann (wegen der rein virtuellen Methode).

Antwort

23

Nach 12,9/4 "Vererben Bauer", wenn using X::X sagen

A constructor so declared has the same access as the corresponding constructor in X.

So ist der geerbten Konstruktor ist auch protected.

+0

[Beispiel von GCC 4.8, das es richtig macht.] (Http://ideone.com/7JpC2J) –

+3

Warten Sie, was an Konstruktoren so besonders ist? Das gleiche gilt nicht für normale Funktionen ... – Mehrdad

+1

@TemplateRex: Ich weiß, ich frage warum. – Mehrdad