La covarianza tra void*
e T*
non è consentito perché:
1. mancanza di coerenza.
L'attuale modo di covarianza è banale da comprendere e non crea confusione.
Immaginate solo il tipo di covarianza void*
. Per 1 stadio di derivazione va bene, ma poi creerà confusione. es .:
struct void_ { virtual void* foo(); };
struct int_ : void_ { virtual int* foo(); };
struct double_ : int_ { virtual double* foo(); }; // int* to double* or void* to double*
Nel 3 ° gerarchia di struct double_
, l'utente sarà confuso che anche se double*
a int*
non è possibile, perché il codice è ancora la compilazione? Solo dopo aver controllato la parte più alta della classe void_
, è noto che è a causa di double*
a void*
è "covariante". Lo stesso vale per il compilatore così :-)
2. Problema con i riferimenti
In caso di classi, di ritorno B&
/D*
/DD*
è possibile. Ma la stessa cosa non è possibile con void&
e quindi int&
ecc
3. Miscele di covarianze
Se void*
è consentito poi seguito è consentito anche involontariamente.
struct void_ { virtual void* foo(); };
struct Base : void_ { virtual Base* foo(); };
struct Derived : Base { virtual int* foo(); }; // Look at `int*`
Il che aggiunge confusione.
Sarebbe bello se potessi spiegare il "perché" di questo progetto. – Mehrdad
@ Mehrdad Aggiunto un preventivo D & E. –
Quando guardo al problema con la covarianza e le limitazioni degli spazi dei nomi in C++, posso discernere il ragionamento dietro l'oggetto e i pacchetti di Java. – ady