Предположим, у меня есть абстрактный базовый класс, который просто определяет контейнер, для которого можно выполнить сложение:
class Base {
public:
virtual ~Base() {}
virtual Base operator+(const Base& rhs) =0;
};
Затем я хочу, чтобы подклассы Base обеспечивали фактическую операцию:
class Derived: public Base {
public:
Base operator+(const Base& rhs) { // won't compile
// actual implementation
}
};
Вот моя проблема: оператор + () должен возвращать новый объект Base, но, будучи абстрактным, он не будет компилироваться.
Я пытался обойти это, используя фабрику для возврата ссылки на базовый объект, но затем в теле оператора я выполняю приведение типов, поскольку сложение имеет смысл только для производных объектов.
В любом случае мне кажется, что я кусаю свой хвост, есть ли правильное решение для этого?
ОБНОВЛЕНИЕ: Судя по ответам, похоже, я использую неправильныйшаблон.Я хочу отделить интерфейс от реализации, так что код библиотеки должен знать только интерфейс, а клиентский код обеспечивает реализацию.Я попытался сделать это, предоставив интерфейс как абстрактный базовый класс, а реализацию - как подклассы.
ОБНОВЛЕНИЕ 2: Мой вопрос был на самом деле 2 вопроса, конкретный (о перегрузке операторов в абстрактных классах) и другой о моем намерении (как я могу позволить клиенту настроить реализацию).На первое ответили: нет.Для последнего кажется, что шаблон класса интерфейса, который я использую, на самом деле является хорошим для решения этой проблемы (согласно Гриффитсу и Рэдфорду ), просто я не должен связываться с перегруженными операторами.