2012-03-24 11 views
9

Wie wird ein abgeleitetes Klassenobjekt instanziiert, dessen Basisklasse ctor privat ist?Instanziieren Sie ein abgeleitetes Klassenobjekt, dessen Basisklasse ctor privat ist

Da die abgeleitete Klasse ctor implizit die Basisklasse ctor aufruft (was privat ist), gibt der Compiler einen Fehler aus.

diesen Beispiel-Code Betrachten unter:

#include <iostream> 

using namespace std; 

class base 
{ 
    private: 
     base() 
     { 
     cout << "base: ctor()\n"; 
     } 
}; 

class derived: public base 
{ 
    public: 
     derived() 
     { 
     cout << "derived: ctor()\n"; 
     } 
}; 

int main() 
{ 
    derived d; 
} 

Dieser Code der Kompilierung-Fehler gibt:

accessing_private_ctor_in_base_class.cpp: In constructor derived::derived()': accessing_private_ctor_in_base_class.cpp:9: error: base::base()' is private accessing_private_ctor_in_base_class.cpp:18: error: within this context

Wie kann ich den Code ändern, die Kompilierung-Fehler zu entfernen?

Antwort

14

Es gibt zwei Möglichkeiten:

  • Machen Sie den Basisklassenkonstruktor entweder public oder protected.
  • Oder machen Sie die abgeleitete Klasse eine friend der Basisklasse. siehe demo
+1

@ Nawaz: die abgeleitete Klasse zu einem Freund der Basisklasse zu machen, hat funktioniert! –

1

Sie können nicht. Das ist normalerweise der Grund, die einzige c'tor private zu machen, Vererbung zu verbieten.

+0

Singletons haben auch eine Verwendung dafür. – chris

2

Sie können nicht von einer Basisklasse erben, deren einziger Konstruktor privat ist.

Also machen Sie den Basisklassenkonstruktor public/protected oder fügen Sie einen anderen Basisklassenkonstruktor hinzu.


1. Es sei denn, wie Nawaz betont, sind Sie ein Freund der Basisklasse.

Verwandte Themen