混乱の理解仮想関数呼び出しと依存ベースクラス
-
27-10-2019 - |
質問
私は電子ブックテンプレートから読んでいます完全なガイドと私が尋ねる質問はあなたに愚かかもしれませんが..
その中にセクションがあります 9.4.2依存ベースクラス 私は理解できません。
ここからの部分的なテキストは次のとおりです。 http://tinypaste.com/633f0
// Variation 2:
template<typename T>
class DD2 : public Base<T> {
public:
void f() { Base<T>::basefield = 0; }
};
上記のテキストでライン(または問題ドメイン)を視覚化するのに役立ちます」資格のない非依存名を仮想関数呼び出しの形成に使用している場合、資格は仮想呼び出しメカニズムとプログラムの意味が変化するため、このソリューションには注意を払う必要があります。それにもかかわらず、最初のバリエーションを使用できず、この代替案が適切な状況があります」
資格のない非依存の名前などを理解していますが、仮想関数呼び出しと混ぜることが私を避けています。
解決
適格名(ベースフィールド)が仮想関数である場合、資格は仮想呼び出しを阻害します。それはあなたが持っている場合と非常に同じです:
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
}
他のヒント
資格のある識別子を使用します class-name::function()
の仮想性を阻害します function
, 、したがって、使用する必要があります this->function()
代わりは。
これは、データメンバーでも機能します。 this->basefield
.
所属していません StackOverflow