3

私は電子ブックのテンプレートの完全なガイドから読んでいますが、私が尋ねる質問はあなたにとってばかげているかもしれませんが..

その9.4.2 Dependent Base Classesには、理解できないセクションがあります。

ここにその部分的なテキストがあります: http://tinypaste.com/633f0

// Variation 2: 
template<typename T> 
class DD2 : public Base<T> { 
  public: 
    void f() { Base<T>::basefield = 0; } 
}; 

上のテキストの行 (または問題ドメイン) を視覚化するのに助けが必要です "この解決策には注意が必要です。仮想関数呼び出しを形成するために修飾されていない非依存名が使用されている場合、修飾によって仮想呼び出しメカニズムとその意味が阻害されるためです。プログラムが変更されます。それにもかかわらず、最初のバリエーションを使用できない状況があり、この代替案が適切です。」

修飾されていない非依存の名前などは理解していますが、それらを仮想関数呼び出しと混合すると、私を逃してしまいます。

4

2 に答える 2

2

修飾名 ( basefield ) が仮想関数の場合、修飾によって仮想呼び出しが禁止されます。それはあなたが持っている場合とほとんど同じです:

struct Base {
  virtual void vCall() { }
};

struct Derived : public Base {
  virtual void vCall() { }
};

int main() {
  Derived d;
  Base* inst = &d;
  inst->Base::vCall(); // By qualifying we won't get virtual dispatch;
                       // this calls Base::vCall directly
}
于 2011-10-20T13:02:44.390 に答える
1

修飾識別子を使用class-name::function()すると の仮想性が阻害さfunctionれるため、代わりに使用する必要がありますthis->function()

これは、データ メンバーにも機能します: this->basefield.

于 2011-12-25T21:55:16.647 に答える