Giả sử tôi có một lớp cơ sở mà nhân bản của các lớp thừa:nguồn gốc mẫu tò mò lặp đi lặp lại và hiệp phương sai
class Base
{
public:
virtual Base * clone()
{
return new Base();
}
// ...
};
tôi có một tập hợp các lớp thừa kế được thực hiện bằng cách sử dụng mô hình mẫu một cách tò mò lặp đi lặp lại:
template <class T>
class CRTP : public Base
{
public:
virtual T * clone()
{
return new T();
}
// ...
};
Và tôi cố gắng lấy thêm từ đó như sau:
class Derived : public CRTP<Derived>
{
public:
// ...
};
Tôi nhận được lỗi biên dịch về ảnh hưởng của:
error C2555: 'CRTP<T>::clone': overriding virtual function return type differs and is not covariant from 'Base::clone'
Tôi nhận thấy đây có thể là kết quả của trình biên dịch không biết đầy đủ về cây thừa kế cho nguồn gốc khi khởi tạo CRTP. Hơn nữa, thay thế kiểu trả về (T *) bằng (Base *) cũng biên dịch. Tuy nhiên, tôi muốn biết nếu có một công việc xung quanh mà vẫn giữ lại ngữ nghĩa trên.
Đối với những gì đáng giá, GCC 4.1.2 và 4.7.1 đều cung cấp các lỗi tương tự. –
Bản sao của http://stackoverflow.com/questions/15570333/crtp-and-dynamic-polymorphism-compile-error – erikced
@erikced Cảm ơn những người đứng đầu. Có vẻ như tôi không thể làm gì nhiều, tôi sẽ chỉ thay thế kiểu trả về. – Whanhee