VirtualおよびOverrideキーワード
メニューを表示するにはスワイプしてください
virtual キーワード
virtual キーワードは、class 内でメソッド宣言の前に使用され、前述の問題を解決するために用いられる。これは、すべてのサブクラスで共通だが、それぞれ異なる実装が必要なメソッドに対して使用される。基本的には他のメソッド宣言と同様だが、virtual で始まる点が異なる。
Base.h
1234567class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };
関数がスーパークラスで virtual として宣言されている場合、サブクラスでオーバーライドできる。つまり、サブクラスは独自の実装を提供でき、関数がスーパークラスのポインタや参照を通じて呼び出されたとき、元の実装ではなくその実装が呼び出される。
main.cpp
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(); }
オブジェクトへのポインタがあり、そのポインタを通じてメンバーにアクセスしたい場合は、アロー演算子(->)を使用。
ボタンに関する元の問題の解決策に戻ると、この方法により、親クラスであるButtonのポインタをパラメータとして受け取る単一の関数を簡単に作成可能。この関数にSubmitButton、ResetButton、CancelButtonを渡すことで、意図した通りに動作。
main.cpp
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); }
異なるサブクラスのオブジェクトを作成し、それらを関数に渡すことを試してください。
overrideキーワード
overrideキーワードは、サブクラスでメンバ関数がスーパークラスの仮想関数をオーバーライドすることを明示的に示すために使用されます。これにより、サブクラスの関数シグネチャがスーパークラスの仮想関数と一致しない場合、コンパイル時にエラーを検出できます。
main.cpp
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() { }
関数シグネチャのタイプミスや、スーパークラスにオーバーライドしようとしている関数が存在しない場合など、誤りがあると、コンパイラがエラーを生成し、コンパイル時に潜在的なバグを検出するのに役立ちます。この機能は、メソッド名の変更などの追跡が難しい大規模なチーム環境で特に有用です。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください