次のコードがあるとします。
template <class Derived>
class Base {
public:
virtual void foo_impl() = 0;
void foo() {
static_cast<Derived*>(this)->foo_impl(); //A
(*static_cast<Derived*>(this)).foo_impl(); //B
}
};
class Derived : public Base<Derived> {
private:
void foo_impl() {
bar();
}
};
いくつかの質問:
ラインAは仮想関数呼び出しを生成しますか?私がインターネットで見つけることができるものの大部分はこの方法で物事を行うことを推奨していますが、Derivedへのポインタが実際にはDerived2型のオブジェクトを指している可能性があることを考えると、コンパイラが静的ディスパッチを実行する方法がわかりません。パブリック派生。
行Bは、前のポイントで提起した問題を修正しますか(該当する場合)?呼び出しがもはやポインター上になく、したがって*を使用していることを考えると、そうなるようです。仮想関数呼び出しを回避します。しかし、コンパイラが逆参照されたキャストを参照型として扱う場合でも、仮想関数呼び出しを生成する可能性があります...その場合、回避策は何ですか?
C ++ 11のfinalキーワードをfoo_impl()に追加すると、いずれかの(またはその他の関連する)場合のコンパイラの動作が変わりますか?