最終的にC++ 11が追加されました。C++の最終版は、すべての面で最終版を意味しますか?
最後に!
- は、クラスが非継承します:
私は
final
は、2つのことを行い理解しています。 - クラス内の(仮想)関数を(派生クラス内で)オーバーライドできないようにします。
これらはどちらも互いに独立しているようです。しかし、例えば次のように取る:
class Foo
{
public:
virtual void bar()
{
//do something unimportant.
}
};
class Baz final : public Foo
{
public:
void bar() /*final*/ override
{
//do something more important than Foo's bar.
}
};
以上のことから、私はBaz
がfinal
いると信じて、私ははそのvirtual
メンバ関数bar
もfinal
であることを指定する必要はありません。 Baz
は継承できないので、bar
をオーバーライドするという問題は範囲外になります。しかし、私のコンパイラVC + + 2015は、これについて非常に静かです。私は現時点ではこれを他の誰かにテストしていません。
誰かがこのトピックについて少し明るい話をすることができたらうれしいです。標準からの引用(ある場合)は非常に高く評価されます。また、私が気づいていないコーナーケースについても、論理的な信念が損なわれる可能性があることを述べてください。
だから、私の質問は次のとおりです。final class
は、暗黙のうちにもfinal
であることをそのvirtual
機能を暗示していますか?すべき?どうか明らかにしてください。
final
機能は素晴らしい最適化されデ仮想化、のための資格になるので、私はこれを求めています理由があります。どんな助けもありがとうございます。
最終機能は、機能が最終であるものと静的タイプが一致する場合にのみ、仮想化解除されます。 Happenesはめったになく、最初はバーチャルが必要ないという事実を示していることがよくあります。 – SergeyA
@ SergeyAはい。だから私は資格を書いた。 –
コンパイラが仮想呼び出しを必要としないことを保証できれば、(最適化として)仮想呼び出しを実行しません。コンパイラは賢明で、すでにfinalの導入前にこれを行っていました。しかし、今はもっと簡単だと思います。 –