Из-за С++-характера статической привязки для методов это влияет на полиморфные вызовы.
Из Википедии:
Хотя накладные расходы, связанные с этим механизмом отправки, низки, могут по-прежнему быть значительными для некоторых областей применения, что язык был предназначен для таргетинга. По этой причине Бьярне Страуструп, дизайнер С++, избранный, чтобы сделать динамическую отправку опциональной и не по умолчанию. Только функции, объявленные с помощью ключевого слова virtual, будут отправляется на основе типа времени выполнения объекта; другие функции будет отправлен на основе статического типа объекта.
Итак, код:
Polygon* p = new Triangle;
p->area();
при условии, что area()
является функцией non-virtual
в классе родителя, которая overridden
в классе Child, код выше вызовет Parent class method
, который разработчик может не ожидать. (благодаря статической привязке, которую я представил)
Итак, если я хочу написать класс, который будет использоваться другими (например, библиотека), должен ли я сделать все мои функции виртуальными для того, чтобы предыдущий код работал как ожидалось?