В чем причина удаления возможности остановить распространение методов виртуальности?
Позвольте мне быть яснее: на С++, напишите ли вы "virtual void foo()" или "void foo()" в производном классе, он будет виртуальным до тех пор, пока в базовом классе foo объявляется виртуальным.
Это означает, что вызов foo() через производный * указатель приведет к просмотру виртуальной таблицы (в случае, если функция производного2 переопределяет foo), даже если это поведение не требуется программисту.
Позвольте мне привести вам пример (который выглядит довольно вопиющим для меня) о том, как было бы полезно прекратить распространение виртуальности:
template <class T>
class Iterator // Here is an iterator interface useful for defining iterators
{ // when implementation details need to be hidden
public:
virtual T& next() { ... }
...
};
template <class T>
class Vector
{
public:
class VectIterator : public Iterator<T>
{
public:
T& next() { ... }
...
};
...
};
В приведенном выше примере базовый класс Iterator можно использовать для достижения формы "стирания типа" гораздо более понятным и объектно-ориентированным способом. (См. http://www.artima.com/cppsource/type_erasure.html для примера стирания типа.)
Но все же в моем примере можно напрямую использовать объект Vector:: VectIterator (что будет сделано в большинстве случаев) для доступа к реальному объекту без использования интерфейса.
Если виртуальность не была распространена, вызовы Vector:: VectIterator:: next() даже из указателя или ссылки не были бы виртуальными и могли бы быть встроены и работать эффективно, как если бы интерфейс Iterator не был " t существует.