Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ VirtualおよびOverrideキーワード | イントロダクション
C++ OOP原則

bookVirtualおよびOverrideキーワード

メニューを表示するにはスワイプしてください

virtual キーワード

virtual キーワードは、class 内でメソッド宣言の前に使用され、前述の問題を解決するために用いられる。これは、すべてのサブクラスで共通だが、それぞれ異なる実装が必要なメソッドに対して使用される。基本的には他のメソッド宣言と同様だが、virtual で始まる点が異なる。

Base.h

Base.h

copy
1234567
class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };

関数がスーパークラスvirtual として宣言されている場合、サブクラスでオーバーライドできる。つまり、サブクラスは独自の実装を提供でき、関数がスーパークラスのポインタや参照を通じて呼び出されたとき、元の実装ではなくその実装が呼び出される。

main.cpp

main.cpp

copy
123456789101112131415161718192021222324252627
#include <iostream> class Base { public: virtual void display() { std::cout << "Base display() called" << std::endl; } }; class Derived : public Base { public: void display() { std::cout << "Derived display() called" << std::endl; } }; int main() { Base* obj; Derived derived; obj = &derived; obj->display(); }
Note
注意

オブジェクトへのポインタがあり、そのポインタを通じてメンバーにアクセスしたい場合は、アロー演算子(->)を使用。

ボタンに関する元の問題の解決策に戻ると、この方法により、親クラスであるButtonのポインタをパラメータとして受け取る単一の関数を簡単に作成可能。この関数にSubmitButtonResetButtonCancelButtonを渡すことで、意図した通りに動作。

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#include <iostream> class Button { public: virtual void onClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: void onClick() { std::cout << "Upload" << std::endl; } }; class ResetdButton : public Button { public: void onClick() { std::cout << "Reset" << std::endl; } }; class CancelButton : public Button { public: void onClick() { std::cout << "Cancel" << std::endl; } }; void user_clicked_button(Button& btn) { btn.onClick(); } int main() { UploadButton uploadButton; user_clicked_button(uploadButton); }
Note
ノート

異なるサブクラスオブジェクトを作成し、それらを関数に渡すことを試してください。

overrideキーワード

overrideキーワードは、サブクラスメンバ関数がスーパークラスの仮想関数をオーバーライドすることを明示的に示すために使用されます。これにより、サブクラスの関数シグネチャがスーパークラスの仮想関数と一致しない場合、コンパイル時にエラーを検出できます。

main.cpp

main.cpp

copy
1234567891011121314
#include <iostream> class Button { public: virtual void handleClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: // marked override, but does not override void onClick() override { std::cout << "Upload" << std::endl; } }; int main() { }

関数シグネチャのタイプミスや、スーパークラスにオーバーライドしようとしている関数が存在しない場合など、誤りがあると、コンパイラがエラーを生成し、コンパイル時に潜在的なバグを検出するのに役立ちます。この機能は、メソッド名の変更などの追跡が難しい大規模なチーム環境で特に有用です。

question mark

virtualキーワードの主な目的は何ですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 1.  14

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 1.  14
some-alt