Принуждение производного класса к перегрузке виртуального метода в неабстрактном базовом классе

Я пишу некоторый код, используя простой шаблон клонирования. Мне бы хотелось, чтобы я мог заставить производные классы переопределять этот шаблон клонов, но сохранить возможность использовать мой базовый класс. (Поэтому я не хочу объявлять метод клонирования чисто виртуальным.)

Есть ли способ применить это ограничение на уровне компилятора?

1

Решение

К сожалению, просто нет способа сделать это в C ++. Вы не можете принудительно переопределить неабстрактный метод в дочерних классах. Тем не менее, я мог бы заметить, что конкретные базовые классы должны быть довольно редкими в C ++, и вы можете пересмотреть свой дизайн. Получив больше информации о ваших общих целях, мы сможем предоставить лучший ответ для ваших конкретных потребностей.

3

Другие решения

Некоторое время я касался C ++, но я помню, что у вас может быть чисто виртуальный метод с body.

// in header
class YourBase {
public:
virtual Foo bar() = 0;
};

// in source
Foo YourBase::bar() {
// a default impl
}

Это должно вынудить дочерний класс переопределить bar (), оставляя пригодный для использования imp of bar () в YourBase

0

К сожалению, вы не можете принудительно установить во время компиляции, что класс переопределяет метод конкретного базового класса, но вы можете просто assert в каждом clone реализация функции, что тип является типом класса, в котором находится эта реализация,

assert( typeid( *this ) == typeid( ThisClass ) );

а затем запустите тест, который проверяет функциональность клонирования каждого класса.

0
По вопросам рекламы [email protected]