[過去ログ] 【初心者歓迎】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
>>588
588(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