2014-09-25 10 views
5
class A{ 
    public: 
    A(); 
    private: 
    ~A(); 
}; 

class B:public A{ 
    public: 
    B(){}; 
    private: 
    ~B(); 
}; 

int main() 
{ 
    return 0; 
} 

Ho un errore di compilazione come questo:Perché il costruttore derivato ha bisogno di un distruttore di base?

test.cpp: In constructor 'B::B()': 
test.cpp:5:4: error: 'A::~A()' is private 
test.cpp:10:8: error: within this context 

so il costruttore derivato bisogno di invocare il distruttore di base, quindi ho impostato A::A() come public. Tuttavia, perché il compilatore si lamenta del fatto che sia necessario il numero pubblico A::~A()?

+0

@EdChum: No, la domanda non spiega perché il costruttore derivato abbia bisogno di accedere al distruttore della classe base. –

+0

@MikeSeymour sì hai ragione, ritirando il mio voto ravvicinato – EdChum

+0

Probabilmente * * non puoi costruire una classe che non puoi distruggere e non puoi distruggere 'B' perché il distruttore ha bisogno di accedere a' ~ A() 'che è privato (è necessario per renderlo protetto o "amico" di classe B). – firda

risposta

0

Dichiarare il costruttore e il distruttore come pubblici (il costruttore e il conduttore della classe base possono essere protetti, se si assicura che venga chiamato solo dalle sottoclassi). Le sottoclassi quando costruì hanno istanza di classe di base creata come cubobject, quindi o chiamata esplicita o implicita di costruttore e distruttore è fatto

4

La specifica più vicino ho potuto trovare è here - 12.4.10 class.dtor:

... Un programma è malato -formato se viene dichiarato un oggetto di tipo classe o array e il distruttore per la classe non è accessibile nel punto della dichiarazione.

class B non è in grado di accedere private: ~A(), ma è implicitamente dichiarando class A perché è una classe di base (è quasi la stessa di dichiarare variabili primo membro - tranne l'ottimizzazione di base vuoto).

Io non sono un avvocato di lingua e non un madrelingua, ma l'inaccessibile classe base distruttore sembra essere il problema e quanto sopra può spiegare perché i punti di errore al costruttore B() (il compilatore può effettuare i controlli quando sono davvero necessari, non prima).

Il distruttore ~A() deve essere reso almeno protected o B amico di A.

3

nucleo Standards Committee Il C++ gruppo di lavoro rapporto di difetto 1424 (presentata da Daniel Krugler su 2011-12-07) dice:

L'attuale specifica non sembra di dire se un'implementazione è consentito/richiesto/vietato sporgere lamentele quando il distruttore di un oggetto secondario non è accessibile.

problema è stato risolto in C++ 14 con l'aggiunta del concetto di un distruttore essere potenzialmente invocata. L'attuale progetto parte standard 12.6.2 (10) dice:

In un costruttore non delega, il distruttore per ciascuna classe base diretta o virtuale e per ciascun elemento di dati non-statico del tipo di classe è potenzialmente invocato (12.4).

[Nota: Questa disposizione assicura che distruttori possono essere richiamati per sub-oggetti completamente costruiti in caso viene generata un'eccezione (15.2).-end nota]

E 12.4 (11):

Un distruttore viene richiamato potenzialmente se viene invocata o come specificato in 5.3.4 e 12.6.2. Un programma è mal formato se un distruttore che è potenzialmente invocato viene eliminato o non accessibile dal contesto dell'invocazione.

Problemi correlati