質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

Q&A

解決済

1回答

3771閲覧

C++ 多重継承時のダウンキャストでのエラー

kuniatsu

総合スコア141

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

0グッド

1クリップ

投稿2016/04/19 04:30

多重継承をしているクラスをアップキャスト後にダウンキャストした際にうまくつかえなくなってしまいます。
クラス自体が多重継承していても一度アップキャストしてしまうと、別の流れを組でいた側の機能は使えなくなってしまうのでしょうか?

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Human {
protected:
string name;

public:
virtual void show() {
cout << "Human" << endl;
}
};

class Japanese :public Human {
protected:
string todouhuken;
public:
virtual void show() {
cout << "Japanese" << endl;
}
};

class Woman {
protected:
int age = 21;
public:
virtual void ages(int) = 0;
};

class Nadeshiko :public Japanese, public Woman {
public:
Nadeshiko(string name) {
Human::name = name;
}
void show() {
cout << "Nadeshiko" << endl;
}
void ages(int nowAge) {
age = nowAge;
}
};

void main()
{
vector<Human> humanList;

Nadeshiko nadeshiko("よしこ"); humanList.push_back(nadeshiko);//アップキャスト //省略 for each(Human h in humanList) { Human* ph; ph = &h; Nadeshiko* pn; pn = dynamic_cast<Nadeshiko *>(ph);//ダウンキャスト pn->ages(30);//ここでエラーがでる }

}

よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

vector<Human> humanList;はHumanのインスタンスの動的配列ですので、ポインタではなく領域そのものへアップキャストされており、この時点で派生クラスの情報が失われてしまいます。(vector<Human>にはHumanクラスの情報しか記録できる領域がありませんので。)

vector<Human*> humanList;として使えばよいのですか、領域管理が面倒です。
C++ オブジェクトのコレクションによるとunique_ptr<>やshard_ptr<>を使うとよさそうです。

投稿2016/04/19 05:14

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuniatsu

2016/04/19 05:27

やはりそうでしたか、諦めがつきました。別の方法で実装してみます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問