Hiệp phương sai giữa void*
và T*
không được phép bởi vì:
1. thiếu nhất quán.
Cách hiện tại của hiệp phương sai là tầm thường để hiểu và không gây nhầm lẫn.
Chỉ cần tưởng tượng về void*
loại hiệp phương sai được cho phép. Đối với 1 giai đoạn của derivation là tốt, nhưng sau đó nó sẽ tạo ra sự nhầm lẫn. ví dụ .:
struct void_ { virtual void* foo(); };
struct int_ : void_ { virtual int* foo(); };
struct double_ : int_ { virtual double* foo(); }; // int* to double* or void* to double*
Trong hệ thống phân cấp thứ 3 của struct double_
, người dùng sẽ bị nhầm lẫn rằng mặc dù double*
để int*
là không thể, tại sao đoạn code vẫn biên dịch? Chỉ sau khi kiểm tra các lớp hàng đầu nhất void_
, nó được biết rằng đó là vì double*
đến void*
là "covariant". Cũng vậy với trình biên dịch cũng :-)
2. Vấn đề với các tài liệu tham khảo
Trong trường hợp của các lớp học, trở về B&
/D*
/DD*
là có thể. Nhưng điều tương tự là không thể với void&
và do đó int&
, vv
3. Trộn của hiệp phương sai
Nếu void*
được phép rồi sau cũng được phép vô ý.
struct void_ { virtual void* foo(); };
struct Base : void_ { virtual Base* foo(); };
struct Derived : Base { virtual int* foo(); }; // Look at `int*`
Điều gì làm tăng thêm sự nhầm lẫn.
Sẽ rất tuyệt nếu bạn có thể giải thích "lý do" đằng sau thiết kế này. – Mehrdad
@Mehrdad Đã thêm báo giá D & E. –
Khi tôi xem xét vấn đề với hiệp phương sai và các giới hạn của các không gian tên trong C++ thì tôi có thể phân biệt được lý do đằng sau đối tượng và gói của Java. – ady