Есть базовый абстрактный класс с некоторыми методами.
Эти методы используют большинство производных классов.
Но для одного типа класса функция не нужна.
Например:
const MyStruct& childClass::getMyStruct()
{
return что?
}
У childClass не может быть члена MyStruct, чтобы его вернуть.
Всё-таки как сделать правильно? Сунуть объект, чтобы был, или есть нормальное решение?
Измените иерархию. Абстрактный класс БЕЗ этого метода, его наследник - абстрактный класс С ним. И соответствующие наследники - от основного абстрактного класса - тот ваш производный, для которого реализация невозможна; все остальные - производные от производного абстрактного.
Если в базовом классе определены абстрактные методы, то возможны два варианта
В любом случае наследник не имеет никакого права говорить, что какие-то методы не нужны. Если наследник не может реализовать тот или иной метод, то сам наследник должен быть абстрактным.
Если абстрактный метод не принадлежит ни одной из этих двух категорий, то он никому не нужен и должен быть удален из класса.
Исключение может составлять случай, когда наследник управляет алгоритмом работы родителя. Что-то типа такого
class Base {
virtual bool compare() = 0;
virtual const MyStruct& getMyStruct() = 0;
virtual const MyStruct& getMyOtherStruct() = 0;
void doSomething() {
MyStruct = struct1;
if (compare())
getMyStruct() = struct1;
else
getMyOtherStruct() = struct1;
}
}
тогда если мы определим в дочернем классе
class Child:public Base {
bool compare() {
return true;
}
}
то мы можем быть уверены, что метод getMyOtherStruct не вызовется никогда. Тогда мы можем просто ничего из него не возвращать, а просто бросить исключение
const MyStruct& getMyOtherStruct() {
throw "Call abstract method";
}
Но нужно помнить об одной особенности. Никто не мешает сделать так
class Child2:public Child {
bool compare() {
return false;
}
}
тогда компилятор уже не сможет предупредить, что не все методы определены и если забыть самому переопределить getMyOtherStruct то получите законный exception
Если, несмотря на возможные архитектурные изъяны с наследованием, функция всё таки нужна, можно предложить заменить ссылку хотя бы на указатель. И возвращать в таком случае nullptr. Хотя, как я считаю, наличие функции в базовом классе должно подразумевать ее существование во ВСЕХ производных классах. Иначе, стоит задуматься о создании более расширенной иерархии классов.
const MyStruct& childClass::getMyStruct();
Попробуй.
throw;
return *(MyStruct*)(nullptr);
Но толку в ретурне этом 0.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники