Помимо способов, описанных в предыдущих ответах - состав, частное наследование и не приватное наследование, но с унаследованным методом, объявленным закрытым, - еще один способ явно delete
унаследованный метод:
#include <iostream>
struct A {
void foo() { std::cout << "foo\n"; }
};
struct B : A {
void foo() = delete;
};
int main() {
B b;
b.foo(); // COMPILER ERROR
}
Хотя вызов b.foo()
вызывает ошибку компилятора, клиентский код все равно может вызвать версию базового класса, указав идентификатор базового класса A
:
b.A::foo(); // compiles, outputs 'foo' to console
Этот явный способ удаления работает, когда foo
is not виртуальный не удаленный метод в A
.Согласно стандарту C ++ 11 §10.3 / 16, это явное удаление некорректно, когда удаленный метод в производном классе переопределяет виртуальный не удаленный метод базового класса.Для получения дополнительной информации об этом ограничении см. Ответы на вопрос SO C ++ 11 Удалить переопределенный метод .