Vì vậy, sau khi tìm kiếm rất nhiều câu trả lời cho câu hỏi của tôi, cuối cùng tôi đã từ bỏ các kỹ năng của Google.Định nghĩa lại typedef trong lớp dẫn xuất?
Tôi có một lớp cơ sở Cơ sở và một lớp dẫn xuất Có nguồn gốc. Tôi muốn ghi đè loại trong lớp Cơ sở với một trong các lớp Có nguồn gốc. Dưới đây là một ví dụ:
class Apple {
public:
Apple() { }
// ...
};
class Orange {
public:
Orange() { }
// ...
};
class Base {
public:
typedef Apple fruit;
// ...
virtual fruit func() { return Apple(); }
};
class Derived : public Base {
public:
typedef Orange fruit;
// ...
fruit func() override { return Orange(); } // <-- Error C2555!
};
Mã này không làm việc, và nó mang lại cho một
C2555 error ('Derived::func': overriding virtual function return type differs and is not covariant from 'Base::func').
Trên là một trong những giải pháp tôi đã cố gắng. Tôi cũng đã thử tạo một lớp lồng nhau ảo trong Base và được xác định lại trong Có nguồn gốc và cũng không biên dịch (cũng rất lộn xộn).
Tôi cũng không thể lấy được táo và cam từ lớp cơ sở cùng trở về con trỏ/tham chiếu đến lớp cha mẹ của họ trong cơ sở và nguồn gốc. Tôi cần phải thể chất trở lại một thể hiện của đối tượng.
- Có cách nào tôi có thể khai báo typedefs trừu tượng không?
- Nếu không, có giải pháp nào khác có thể đạt được những gì tôi đang cố gắng thực hiện không?
Từ khóa 'override' giúp loại bỏ lỗi của con người (như lỗi chính tả) bằng cách kiểm tra trình biên dịch nếu hàm thực sự ghi đè bất kỳ phương thức cơ sở nào hay không. Về vấn đề này, tôi biết điều đó. Có cách nào tôi _could_ làm cho họ covariant mà không cần sử dụng con trỏ hoặc tài liệu tham khảo? – Zeenobit
Vì vậy, tôi đoán không có giải pháp để thực hiện công việc này. Cảm ơn mọi người. Tôi sẽ cố gắng sử dụng một hệ thống phân cấp khác. – Zeenobit