[過去ログ] 【初心者歓迎】C/C++室 Ver.102【環境依存OK】 (1002レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
577(1): デフォルトの名無しさん [] 2018/04/15(日) 10:08:58 ID:c4dXLki+(1/8) AAS
class Base {
public:
void A();
protected
virtual void B();
}
void Base::A() {
B();
}
void Base::B() {
cout << "Base" << endl;
}
class Derived : public Base {
protected
virtual void B();
}
void Derived::B() {
cout << "Derived" << endl;
}
Base b;
b.A(); ⇒ 「Base」が表示される。
Derived d;
d.A(); ⇒ 「Derived」が表示される。
b = d;
b.A() ⇒ 「Base」が表示される。
578(1): デフォルトの名無しさん [] 2018/04/15(日) 10:11:08 ID:c4dXLki+(2/8) AAS
b = d;
b.A() ⇒ 「Base」が表示される。
↑で、なぜ、「Derived」が表示されないのでしょうか?
ロベールの本に、
「仮想関数はどんな状況でもそのオブジェクトの本来の型のものが呼ばれる」
と書いてあります。
581: デフォルトの名無しさん [] 2018/04/15(日) 10:41:29 ID:c4dXLki+(3/8) AAS
>>578-579
よく分かりません。
ポリモーフィズムというのがありますが、その考え方だと
b = d;
b.A() ⇒ 「Derived」が表示される。
のではないかと思ってしまいます。
582(1): デフォルトの名無しさん [] 2018/04/15(日) 10:59:34 ID:c4dXLki+(4/8) AAS
Base::B() の virtual を削除する:
class Base {
public:
void A();
protected
void B();
};
すると、
Base b;
b.A(); ⇒ 「Base」が表示される。
Derived d;
d.A(); ⇒ 「Base」が表示される。
589: デフォルトの名無しさん [] 2018/04/15(日) 12:36:47 ID:c4dXLki+(5/8) AAS
>>583-585
ありがとうございました。
C++が難しいというのは、設計が悪いからですか?
C++と同等の機能を持った言語で、C++よりも分かりやすい言語を新たに
設計することは無理ですか?
590: デフォルトの名無しさん [] 2018/04/15(日) 12:37:23 ID:c4dXLki+(6/8) AAS
>>587-588
ありがとうございました。
試してみようと思います。
591: デフォルトの名無しさん [] 2018/04/15(日) 12:43:40 ID:c4dXLki+(7/8) AAS
理由があってC++を習得するのが難しいのならOKですが、設計が悪いから
難しいということになると、利用者にとっては迷惑な話ですね。
599(1): デフォルトの名無しさん [] 2018/04/15(日) 18:07:17 ID:c4dXLki+(8/8) AAS
>>588588(2): デフォルトの名無しさん [] 2018/04/15(日) 12:35:11 AAS
>>582
間違えた
Base *bp;
bp = &d;
b->A();
試してみました。
確かにポインタを使うと期待通りの結果でしたが、参照を使うと期待通りにはいきませんでした。
これはなぜでしょうか?
#include "Derived.h"
int main() {
Base b;
Base& br = b;
br.A();
Derived d;
br = d;
br.A();
Base *bp;
bp = &b;
bp->A();
bp = &d;
bp->A();
}
実行結果は以下です。
Base
Base
Base
Derived
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.041s