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