тому, как разрастается код. Хотелось бы по максимуму его сократить и при этом сохранить качество.
Скажите, есть ли способ обеспечить некоторые сабклассы дефолтной реализацией, при этом не обязывая их перегружать методы и запрещая пользователю определять объекты класса-родителя?
То есть я хочу что-то такое:
struct Base {
virtual void foo() = 0;
};
void Base::foo() {
//default implementation
}
struct Derived : Base {
//some class-specific methods
};
//...
Derived d;
d->foo(); //моветон?
Отмечу также, что базовый класс параметризуется типом наследника:
template <typename Child = void>, чтобы возвращать нужную ссылку в сеттерах. Можно ли, например, сделать static_assert(!is_void<Child>) или enable_if<...> в базовом классе (оставив его неабстрактным) и надеятся, что пользователь библиотеки не сделает в коде Base<Derived> base;? Есть ли какие-то более надёжные решения?
тянет на обычный шаблонный класс
в чем проблема не писать = 0 в методе, если хочешь сделать дефолтную штуку?
В наследнике его придется явно переопределить. Экономия на спичках, на мой взгляд
? =0 заставляет определять
А я что написал?)
Хочу все сделать красиво, чтобы пользователь мог создавать только объекты наследников
ну помути что то с friend и приватными конструкторами
В базовом классе куча общих сеттеров, три наследника. Выйдет где-то + 30 строк
Унаследоваться от базы с приватными конструкторами?
protected-конструктор вроде бы все решает
Обсуждают сегодня