Я пишу некоторый код, используя простой шаблон клонирования. Мне бы хотелось, чтобы я мог заставить производные классы переопределять этот шаблон клонов, но сохранить возможность использовать мой базовый класс. (Поэтому я не хочу объявлять метод клонирования чисто виртуальным.)
Есть ли способ применить это ограничение на уровне компилятора?
К сожалению, просто нет способа сделать это в C ++. Вы не можете принудительно переопределить неабстрактный метод в дочерних классах. Тем не менее, я мог бы заметить, что конкретные базовые классы должны быть довольно редкими в C ++, и вы можете пересмотреть свой дизайн. Получив больше информации о ваших общих целях, мы сможем предоставить лучший ответ для ваших конкретных потребностей.
Некоторое время я касался C ++, но я помню, что у вас может быть чисто виртуальный метод с body.
// in header
class YourBase {
public:
virtual Foo bar() = 0;
};
// in source
Foo YourBase::bar() {
// a default impl
}
Это должно вынудить дочерний класс переопределить bar (), оставляя пригодный для использования imp of bar () в YourBase
К сожалению, вы не можете принудительно установить во время компиляции, что класс переопределяет метод конкретного базового класса, но вы можете просто assert
в каждом clone
реализация функции, что тип является типом класса, в котором находится эта реализация,
assert( typeid( *this ) == typeid( ThisClass ) );
а затем запустите тест, который проверяет функциональность клонирования каждого класса.