2014-04-15 6 views
7

Ich habe Klasse base, die nur private Standardkonstruktor und öffentlichen Konstruktor für gelöschte Kopie enthält, und nichts anderes.Vererben von einer Klasse, die den Kopierkonstruktor gelöscht hat

class base { 
private: 
    base() = default; 

public: 
    base(const base&) = delete; 
}; 

Wenn ich versuche, von base zu erben und eine Instanz der Klasse derived wie unten erstellen, g ++ 4.8.2 nicht mein Code kompilieren, aber VC++ 2013 der Fall ist.

class derived : public base { 
private: 
    derived() = default; 
}; 

derived x; 

Also, ist es ein Fehler in g ++ oder VC++ 2013 nur etwas ignoriert?

Hier ist der komplette Code ...

class base { 
private: 
    base() = default; 

public: 
    base(const base&) = delete; 
}; 

class derived : public base { 
private: 
    derived() = default; 
}; 

derived x; 

int main() { 
} 

... und g ++ Fehlermeldung.

main.cpp:12:5: error: 'constexpr derived::derived()' is private 
    derived() = default; 
    ^
main.cpp:15:9: error: within this context 
derived x; 
     ^
main.cpp: In constructor 'constexpr derived::derived()': 
main.cpp:3:5: error: 'constexpr base::base()' is private 
    base() = default; 
    ^
main.cpp:12:5: error: within this context 
    derived() = default; 
    ^
main.cpp: At global scope: 
main.cpp:15:9: note: synthesized method 'constexpr derived::derived()' first required here 
derived x; 
     ^
+8

Ich würde behaupten, es ist ein Fehler in VS2013. Der Konstruktor ist privat und Sie können daher keine Instanz der Klasse erstellen. –

+0

Aber wenn die abgeleitete Klasse nicht von der Klassenbasis erbt, wird sie von g ++ kompiliert. Vielleicht ist der Standard-Konstruktor, der als Standard markiert ist, genauso wie der implizit deklarierte Standardkonstruktor. – so61pi

+4

@ so61pi Die Tatsache, dass g ++ diesen Fall nicht diagnostiziert, ist [GCC-Fehler 56429] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56429). – Casey

Antwort

5

Sie die Fehler sind Verlesen werden Ihnen sagen, dass der Standard-Konstruktor für derived nicht zugänglich ist (ist private), so dass Sie nicht, dass ein Objekt dieser Art erstellen können. Jetzt macht es public auf dem Niveau derived wird nicht helfen, da der base Konstruktor auch private ist und somit nicht innerhalb des Konstruktors von derived verwendet werden kann.

Warum sollen diese Konstruktoren private sein?

+0

Ich habe gerade einige C++ 11-Funktionen mit VC++ 2013 & g ++: D getestet. – so61pi

Verwandte Themen