(chỉnh sửa từ bài gốc để thay đổi "BaseMessage" thành "BaseMessage const &")C++ Tóm tắt điều hành lớp học quá tải và thực thi giao diện câu hỏi
Hello All, Tôi rất mới để C++, vì vậy tôi hy vọng bạn folks có thể giúp tôi "xem các lỗi của cách của tôi".
Tôi có một hệ thống phân cấp thư và tôi đang cố gắng sử dụng lớp cơ sở trừu tượng để thực thi một giao diện. Đặc biệt, tôi muốn ép buộc từng thông điệp có nguồn gốc để cung cấp một toán tử quá tải < <.
Khi tôi cố gắng làm điều này với một cái gì đó như thế này:
class BaseMessage
{
public:
// some non-pure virtual function declarations
// some pure virtual function declarations
virtual ostream& operator<<(ostream& stream, const BaseMessage& objectArg) = 0;
}
trình biên dịch phàn nàn rằng
"lỗi: không thể khai báo tham số 'objectArg' là loại trừu tượng 'BaseMessage'
Tôi tin rằng cũng có những vấn đề "bạn bè" liên quan ở đây, nhưng khi tôi cố gắng tuyên bố nó là:
virtual friend ostream& operator<<(ostream& stream, const BaseMessage objectArg) = 0;
trình biên dịch thêm một lỗi Ngoài
"lỗi: chức năng ảo không thể làm bạn"
Có cách nào để đảm bảo rằng tất cả các nguồn gốc (message) lớp học của tôi cung cấp một "< <" hành ostream ?
Cảm ơn nhiều,
Steve
Câu trả lời của Nilolai là giải pháp tốt nhất cho những gì bạn đang cố gắng hoàn thành. Tuy nhiên, lỗi cụ thể bạn nhận được là vì bạn đang cố chuyển đối tượng BaseMessage theo giá trị (đối số thứ hai cho toán tử ảo của bạn <<). Điều này không thể làm việc vì BaseMessage bao gồm một hàm ảo thuần túy (cùng một toán tử ảo <<), vì vậy không thể xây dựng một cá thể của một BaseMessage để truyền theo giá trị. Lưu ý rằng phiên bản của toán tử Nilolai << lấy đối số thứ hai của nó bằng tham chiếu (nó sẽ là một lớp có nguồn gốc từ Base). –