Удаленные виртуальные функции разрешены, но их перегрузка запрещена.
§10.3 (11) говорит:
Виртуальная функция , объявленная в классе должно быть определено или объявлено чистым (10.4) в этом классе или в обоих;но никакой диагностики не требуется (3.2).
§8.4.1 говорит, что определена удаленная функция .
И §10.3 (16) говорит:
Функция с удаленным определением (8.4) не должна переопределять функцию, которая не имеет удаленного определения.Аналогично, функция, которая не имеет удаленного определения, не должна переопределять функцию с удаленным определением.
Цель этого последнего правила состоит в том, чтобы гарантировать, что вызов удаленной функции может быть диагностирован навремя компиляции.
Итак, следующий код некорректно сформирован:
struct Base {
virtual void foo();
};
struct Derived : public Base {
virtual void foo() = delete;
};
Но следующий код правильно сформирован:
struct Base {
virtual void foo() = delete;
};
struct Derived : public Base {
virtual void foo() = delete;
};
DEMO
У OP была либо ошибка компилятора, либо проблема QoI (трудно сказать, потому что он не опубликовал весь код), которая с тех пор была исправлена.