Предположим, я хочу иметь класс Base
с двумя методами: foo(int)
и bar(int)
. Я хочу, чтобы они были определены таким образом, что:
Base::foo
должно быть переопределено в производном неабстрактном классе Base::bar
не может быть переопределено в производном классе
Первая цель может быть достигнута, пометив foo
как virtual int foo(int) = 0
, чтобы сделать ее абстрактной. Второе требование можно выполнить, отметив bar
как virtual int bar(int) final
, чтобы сделать его окончательным. Вот код:
class Base
{
public:
virtual int foo(int n) = 0;
virtual int bar(int n) final
{
return n + 42;
}
};
И пример класса, производного от Base
:
class Derived : public Base
{
public:
virtual int foo(int n) override
{
return n * n;
}
int bar(int n) // compilation error here
{
return n + 43;
}
};
Попытка переопределить Base::bar
вызвала ошибку компиляции, как мы и хотели.
Теперь мой вопрос таков: Обозначает ли метод как virtual final
накладные расходы из-за функции virtual
(динамическая диспетчеризация), даже если функция не может быть переопределена в любом случае?
Редактировать
Не обращайте внимания на отсутствие виртуального деструктора ~Base()
Это не здесь, чтобы сделать код короче.