[解決済み] 非仮想的なメソッドのオーバーライド
質問
Visual C++ 2010でこのようなシナリオを想定してみましょう。
#include <iostream>
#include <conio.h>
using namespace std;
class Base
{
public:
int b;
void Display()
{
cout<<"Base: Non-virtual display."<<endl;
};
virtual void vDisplay()
{
cout<<"Base: Virtual display."<<endl;
};
};
class Derived : public Base
{
public:
int d;
void Display()
{
cout<<"Derived: Non-virtual display."<<endl;
};
virtual void vDisplay()
{
cout<<"Derived: Virtual display."<<endl;
};
};
int main()
{
Base ba;
Derived de;
ba.Display();
ba.vDisplay();
de.Display();
de.vDisplay();
_getch();
return 0;
};
理論的には、この小さなアプリケーションの出力は次のようになるはずです。
- ベース。非仮想的なディスプレイ。
- ベース。仮想ディスプレイ。
- ベース。非仮想的なディスプレイ。
- 派生。仮想ディスプレイです。
というのは、BaseクラスのDisplayメソッドは仮想メソッドではないので、Derivedクラスはこれをオーバーライドできないはずだからです。そうですよね?
問題は、アプリケーションを実行すると、このように出力されることです。
- ベース。非仮想的なディスプレイです。
- ベース。仮想ディスプレイ。
- 派生。非仮想的な表示です。
- 派生。仮想ディスプレイです。
つまり、私が仮想メソッドの概念を理解していなかったのか、それともVisual C++で何かおかしなことが起きているのか、どちらかです。
どなたか解説をお願いします。
どのように解決するのですか?
そうですね、少し誤解していますね。
派生クラス上の同名のメソッドは、この場合、親メソッドを隠します。もしそうでなければ、ベースクラスの非仮想メソッドと同じ名前のメソッドを作成しようとすると、エラーが発生するはずだと想像するでしょう。これは許可されており、問題ありません。そして、あなたが行ったようにメソッドを直接呼び出すと、それはうまく呼び出されます。
しかし、非仮想であるため、ポリモーフィズムを可能にする C++ のメソッド検索機構は使用されないでしょう。したがって、たとえば、派生クラスのインスタンスを作成し、ベース クラスへのポインタを介して 'Display' メソッドを呼び出した場合、ベースのメソッドが呼び出されますが、'vDisplay' では派生メソッドが呼び出されることになります。
例えば、以下の行を追加してみてください。
Base *b = &ba;
b->Display();
b->vDisplay();
b = &de;
b->Display();
b->vDisplay();
...そして、期待通りの出力を観察してください。
<ブロッククオート <ブロッククオート
ベースとなる 非仮想的な表示。
ベース。仮想ディスプレイ。
ベース。非仮想的なディスプレイ。
派生。仮想ディスプレイ。
関連
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み] なぜJavaは静的メソッドのオーバーライドを認めないのですか?
-
[解決済み] ベースクラスの仮想関数をオーバーライドしている場合、その関数を呼び出すことはできますか?
-
[解決済み】派生クラスでオーバーライドされた関数が、ベースクラスの他のオーバーロードを隠してしまうのはなぜですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】C++の余分な資格エラー
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み】バーチャル/ピュアバーチャルの説明