final virtual functionsをC++で読むことができることはちょっと混乱しています。最初に両方の修飾子を省略するだけの違いは何ですか?C++での最終的な仮想関数0x
答えて
違いは、それを使用するベースではなく、派生したことです。
class Base {
virtual void foo() = 0;
};
class Derived : Base {
void foo() {}
// Still virtual because it's virtual in base- no way to "un-virtual" it
virtual void foo() final {}
// Now un-overridable.
};
オーバーライドを防止するものではなく、「それ以上の」オーバーライドを防ぐことを考えてください。
ありがとう!私には明らかではないが、仮想が階層全体を運ぶことは明らかである。 –
私は最初、私は同じことを思っていた、C++でvirtual
と一緒にfinal
キーワードの使用に出くわした:それは継承とオーバーライド可能になりvirtual
メソッドを宣言し、メソッドを宣言した場合
を
final
は、そのメソッドがオーバーライドされることを防ぎます。メソッドを宣言しません。は矛盾を形成しますか?
この質問には現在のaccepted answerが良いと思いますが、私はこれを調べて見つけたものに基づいてもう少し詳しく説明しました。
は、次のクラスを考えてみましょう:
class A {
public:
void hide_me();
virtual void override_me();
virtual void cant_override_me() final;
};
実現する重要なことは、3つのメソッド宣言がすべて異なっていると異なるものを意味していることです。
最初:
void hide_me();
は非仮想であり、従って、定義により、オーバーライドすることはできません。
第三は:
virtual void cant_override_me() final;
final
宣言され、したがって、また定義によって、上書きすることはできません。
違いはけど、それはまたをオーバーライドしている(それはvirtual
、であるため)あなたがオーバーライドされるcant_override_me
適格として考えることができ、一方、hide_me
は非仮想であるから、それをオーバーライドすることは、unapplicableであるということですfinal
修飾子のため、が無効になりました。つまり、オーバーライドはvirtual
と宣言されていないメソッドには適用されませんが、virtual
メソッドに適用されますが、final
と宣言されている場合はオーバーライドできません。
今の子クラスを考えてみましょう。
class B: public A {
public:
void hide_me(); // this hide's A's definition of "hide_me()"; this is not overriding.
void override_me(); // implicit "virtual"
//void cant_override_me(); // implicit "virtual"; compilation fails
};
あなたがクラスB
ためhide_me()
を再定義することができますが、これはちょうど、したがって、関数名をオーバーロードしたりhidingされます。 B
はA
のhide_me
メソッドにはA::hide_me()
でアクセスできますが、B
という参照を持つ他の人はB
と宣言しています。:
B *my_b = new B();
はmy_b->A::hide_me()
経由hide_me
のA
年代になりました - 隠された定義にアクセスする必要があります。
cant_override_me()
の再定義はB
になります。
完全な例として、ここでは何が起こっているのか例示するのに役立つプログラムのわずかな再定義である:
#include <cstdio>
class A {
public:
inline void hide_me() {
printf("a hide_me\n");
}
virtual void override_me();
virtual void cant_override_me() final;
};
class B: public A {
public:
inline void hide_me() {
printf("b hide_me\n");
}
void override_me();
inline void foo() {
A::hide_me();
}
// can't override cant_override_me
};
void A::override_me() {
printf("a override_me\n");
}
void A::cant_override_me() {
printf("a cant_override_me\n");
}
void B::override_me() {
printf("b override_me\n");
}
int main (int argc, char *argv[]) {
A *a = new A();
A *ab = new B();
B *b = new B();
a->hide_me();
ab->hide_me();
b->hide_me();
b->A::hide_me();
printf("---\n");
a->override_me();
ab->override_me();
b->override_me();
b->A::override_me();
}
プログラムの出力は
a hide_me
a hide_me
b hide_me
a hide_me
---
a override_me
b override_me
b override_me
a override_me
- 1. 仮想関数コンパイラの最適化C++
- 2. 明示的なオーバーライドして、最終的なC++ 0xの
- 3. 仮想関数のリンカエラーC++
- 4. C++仮想関数の単純な例
- 5. 仮想関数のないコマンドパターン(C++)
- 6. C++仮想関数とスレッド
- 7. C++(仮想)関数テーブル
- 8. 仮想関数オーバーライド仮想関数
- 9. 基本クラス(仮想テーブル/仮想コスト)での仮想最終機能のコスト
- 10. C++:非仮想関数で純粋仮想関数を使用する
- 11. C++では、仮想関数をオーバーライドすると自動的に仮想関数ですか?
- 12. 仮想関数を使用しないC++動的ディスパッチ
- 13. 仮想関数
- 14. C++の仮想関数の概念
- 15. 継承クラスのC++仮想関数
- 16. C++仮想関数の問題が
- 17. C++仮想関数の実装?
- 18. C++仮想キーワードと関数のオーバーライド
- 19. C++仮想関数の出力
- 20. 仮想テンプレート関数の偽装C++
- 21. はCefRequesthandlerクラスの仮想関数C++
- 22. C++仮想関数テーブルの取得インデックス
- 23. C++の "id"関数0x
- 24. 動的ディスパッチ実装 - 仮想関数テーブルオフセット
- 25. は、仮想関数に法的
- 26. 暗黙的に仮想constexpr関数
- 27. C++、私は適切なクラスの静的メソッドを呼び出す仮想メソッド持つ仮想関数
- 28. 仮想関数を使用するC++
- 29. themidia仮想C++ DLL関数は、名前
- 30. C++多態性と非仮想関数
は一例では、Base' '場合、考慮初期の基本 'f'メソッドを宣言する別のクラスから継承されます。 –