Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ VirtualおよびOverrideキーワード | ポリモーフィズム概要
C++オブジェクト指向プログラミング

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ポインタをパラメータとして受け取る単一の関数を簡単に作成できます。その結果、この関数にSubmitButtonResetButton、またはCancelButtonを渡して呼び出すことができ、意図した通りに動作します。

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キーワードの主な目的は何ですか?

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

すべて明確でしたか?

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

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

セクション 5.  2

AIに質問する

expand

AIに質問する

ChatGPT

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

セクション 5.  2
some-alt