(отредактированный исходного сообщение, чтобы изменить «BaseMessage» на «Const BaseMessage &»)C++ абстрактного оператора класса перегрузка и обеспечение интерфейса вопрос
Здравствуйте все, Я новичок в C++, так что я надеюсь, что вы, ребята, может помочь мне «увидеть ошибки моих путей».
У меня есть иерархия сообщений, и я пытаюсь использовать абстрактный базовый класс для обеспечения интерфейса . В частности, я хочу заставить каждое полученное сообщение предоставить перегруженный оператор < <.
Когда я пытаюсь делать это с чем-то вроде этого:
class BaseMessage
{
public:
// some non-pure virtual function declarations
// some pure virtual function declarations
virtual ostream& operator<<(ostream& stream, const BaseMessage& objectArg) = 0;
}
компилятор жалуется, что
«Ошибка: не может объявить параметр„objectArg“быть абстрактного типа„BaseMessage“
Я считаю, что здесь есть и «друг», но когда я попытался объявить его как:
virtual friend ostream& operator<<(ostream& stream, const BaseMessage objectArg) = 0;
компилятор добавил ошибку добавления
«ошибка: виртуальные функции не могут быть друзьями»
Есть ли способ, чтобы убедиться, что все мои производные (сообщение) классов обеспечивают «< <» оператор ostream ?
Спасибо много,
Стив
Ответ Нилолай - лучшее решение для того, что вы пытаетесь выполнить. Однако конкретная ошибка, которую вы получали, заключается в том, что вы пытаетесь передать объект BaseMessage по значению (второй аргумент вашему виртуальному оператору <<). Это не может работать, потому что BaseMessage включает в себя чистую виртуальную функцию (тот же виртуальный оператор <<), поэтому невозможно создать экземпляр BaseMessage для передачи по значению. Обратите внимание, что версия оператора Nilolai << принимает второй аргумент по ссылке (это будет некоторый класс, полученный из Base). –