メソッド仮想性の伝播を停止する機能を削除する理由は何ですか?
より明確にしましょう: C++ では、派生クラスに「virtual void foo()」または「void foo()」を記述しても、基底クラスで foo が virtual と宣言されている限り、virtual になります。
これは、派生* ポインターを介した 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 インターフェイスが存在しないかのように、インライン化して効率的に実行できます。