Оставляя в стороне деструкторы, реализации чисто виртуальных функций - странная вещь, потому что они никогда не вызываются естественным образом.т. е. если у вас есть указатель или ссылка на ваш базовый класс, базовый объект всегда будет некоторым производным, который переопределяет функцию, и который всегда будет вызываться.
Единственный способ фактически получить вызываемую реализацию - этоиспользование синтаксиса Base :: func () от одной из перегрузок производного класса.
Это на самом деле, в некотором смысле, делает его лучшей целью для встраивания, как в точке, где компилятор хочет вызвать его,всегда ясно, какая перегрузка вызывается.
Кроме того, если бы реализации для чисто виртуальных функций были запрещены, был бы очевидный обходной путь для некоторой другой (возможно защищенной) не виртуальной функции в базовом классе, которую вы могли бы просто вызывать обычным способом из производногофункция.Конечно, область действия будет менее ограниченной, так как вы сможете вызывать ее из любой функции.
(Кстати, я предполагаю, что Base::f()
можно вызывать только с этим синтаксисом из Derived::f()
ине из Derived::anyOtherFunc()
. Я прав с этим предположением?).
Чистые виртуальные деструкторы - это отдельная история, в некотором смысле.Он используется в качестве техники просто для предотвращения создания кем-либо экземпляра производного класса без каких-либо чистых виртуальных функций где-либо еще.
Ответ на реальный вопрос «почему» это не разрешено, на самом деле только потому, чтотак сказал комитет по стандартам, но мой ответ проливает некоторый свет на то, чего мы пытаемся достичь в любом случае.