Die Kovarianz zwischen void*
und T*
ist nicht erlaubt, weil:
1. Mangel an Kohärenz.
Der aktuelle Weg der Kovarianz ist trivial zu verstehen und schafft keine Verwirrung.
Stellen Sie sich vor void*
Art der Kovarianz ist erlaubt. Für eine Stufe der Ableitung ist in Ordnung, aber dann wird es Verwirrung schaffen. z.B .:
struct void_ { virtual void* foo(); };
struct int_ : void_ { virtual int* foo(); };
struct double_ : int_ { virtual double* foo(); }; // int* to double* or void* to double*
In der dritten Hierarchie der struct double_
, wird der Benutzer verwirrt, dass, obwohl double*
zu int*
nicht möglich ist, warum wird der Code noch kompilieren? Nur nach Überprüfung der obersten Klasse void_
ist bekannt, dass es wegen double*
void*
"kovariant" ist. Das Gleiche gilt für Compiler als auch :-)
2. Ausgabe mit den Referenzen
Bei Klassen, Rückkehr B&
/D*
/DD*
möglich ist. Aber gleiche Sache ist nicht möglich, mit void&
und damit int&
usw.
3. Mischen von Kovarianzen
Wenn void*
darf dann auch unbeabsichtigt erlaubt folgt.
struct void_ { virtual void* foo(); };
struct Base : void_ { virtual Base* foo(); };
struct Derived : Base { virtual int* foo(); }; // Look at `int*`
Was zu Verwirrung führt.
Wäre nett, wenn Sie das "warum" hinter diesem Entwurf erklären könnten. – Mehrdad
@Mehrdad Ein D & E-Zitat hinzugefügt. –
Wenn ich mir das Problem mit der Kovarianz und den Einschränkungen von Namespaces in C++ anschaue, kann ich die Gründe für das Objekt und die Pakete von Java erkennen. – ady