2012-03-24 15 views
9

Come creare un'istanza di un oggetto di classe derivato, il cui classctor di base è privato?Istanzia un oggetto di classe derivata, il cui classctor di classe base è privato

Poiché il ctor della classe derivata richiama implicitamente il ctor della classe base (che è privato), il compilatore restituisce un errore.

Considerate questo codice di esempio riportato di seguito:

#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; 
} 

Questo codice dà l'errore di compilazione:

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

Come posso modificare il codice per rimuovere l'errore di compilazione?

risposta

14

Ci sono due modi:

  • rendere il costruttore della classe base sia public o protected.
  • Oppure, rendere la classe derivata a friend della classe base. vedi demo
+1

@ Nawaz: rendendo la classe derivata un amico della classe base ha funzionato! –

1

Non è possibile. Di solito è questa la ragione per rendere privato l'unico attore, non consentire l'ereditarietà.

+0

Anche i singleton sono utili. – chris

2

Non è possibile ereditare da una classe base il cui unico costruttore è privato.

Quindi rendere pubblico/protetto il costruttore di classe base o aggiungere un altro costruttore di classe base.


1. A meno che, come sottolinea Nawaz, sei un amico della classe base.

Problemi correlati