[解決済み] C++で仮想関数が必要な理由とは?
2022-03-04 01:08:03
質問
C++を勉強しているのですが、仮想関数に入ったところです。
私が読んだ限りでは(本やネットで)、仮想関数は基底クラスにある関数で、派生クラスでオーバーライドできるものだそうです。
しかし、この本の序盤、基本的な継承について学習する際に、派生クラスでベース関数をオーバーライドするために
virtual
.
では、ここで何が足りないのでしょうか?仮想関数にはもっと重要なことがあるのは知っていますし、重要なことのようなので、具体的にどんなことなのかはっきりさせたいと思っています。ただ、ネット上でわかりやすい答えが見つからないのです。
どのように解決するのですか?
を理解するだけでなく、どのように理解したかを説明します。
virtual
というのは、この関数がなぜ必要なのか、ということです。
例えば、この2つのクラスがあるとします。
class Animal
{
public:
void eat() { std::cout << "I'm eating generic food."; }
};
class Cat : public Animal
{
public:
void eat() { std::cout << "I'm eating a rat."; }
};
メイン関数の中で
Animal *animal = new Animal;
Cat *cat = new Cat;
animal->eat(); // Outputs: "I'm eating generic food."
cat->eat(); // Outputs: "I'm eating a rat."
ここまでは良いのですが、どうでしょう?動物が一般的な食べ物を食べ、猫がネズミを食べる。
virtual
.
では、少し変えてみましょう。
eat()
は中間関数(この例では単なる些細な関数)を経由して呼び出されます。
// This can go at the top of the main.cpp file
void func(Animal *xyz) { xyz->eat(); }
さて、私たちのメイン関数は
Animal *animal = new Animal;
Cat *cat = new Cat;
func(animal); // Outputs: "I'm eating generic food."
func(cat); // Outputs: "I'm eating generic food."
あ、あぁ...Cat を
func()
しかし、ネズミは食べません。オーバーロードする場合は
func()
を取るので
Cat*
? もし、Animalからさらに動物を派生させなければならないとしたら、それらはすべて独自の
func()
.
解決策としては
eat()
から
Animal
クラスに仮想関数を追加します。
class Animal
{
public:
virtual void eat() { std::cout << "I'm eating generic food."; }
};
class Cat : public Animal
{
public:
void eat() { std::cout << "I'm eating a rat."; }
};
メイン
func(animal); // Outputs: "I'm eating generic food."
func(cat); // Outputs: "I'm eating a rat."
完了です。
関連
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み] コンストラクタ内の仮想メンバー呼び出し
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] 配列のベクトルを扱う正しい方法