[解決済み] C++で仮想関数が必要な理由とは?
2022-03-18 20:10:55
質問
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."
完了です。
関連
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] 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++でint型に無限大を設定する
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。