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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1521閲覧

継承したクラスでの表示をしたい

pinno

総合スコア5

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/08/24 10:36

c++のクラス継承の質問です。
クラス構成はBacicクラスの派生をStudentクラス、そのStudentクラスの派生をTransmigrationクラスとしています。
問題点は、出力の際にオブジェクトperson5が、変数は引数そのままにStudentクラスのstatusOpen関数で出力されてしまいます。Transmigrationクラスの形で出力したです。そのためにTransmigrationクラスのコンストラクタであるTransmigration(Student person)を使用して問題解決したいのですが、その処理とmain文の変更の仕方を教えて下さい。

Basic.h #include <iostream> #include <string> using namespace std; class Basic { //メンバ変数 public: string name; string id; string job; //メンバ関数 public: //コンストラクタ(引数なし) Basic() { id = "0"; } //コンストラクタ(引数あり) Basic(string id_in, string name_in, string job_in) { id = id_in; // 学籍番号 name = name_in; // 氏名 job = job_in; // 職業 } //コピーコンストラクタ Basic(const Basic& bc) { id = bc.id; name = bc.name; job = bc.job; } public: // メンバ変数に値を設定 void setStatus(string id_in, string name_in, string job_in) { id = id_in; name = name_in; job = job_in; } // メンバ変数表示 void statusOpen(void) { cout << "番号:" << id << "\n"; cout << "名前:" << name << "\n"; cout << "職業:" << job << "\n"; cout << "\n"; } ~Basic() { static int num = 0; num++; cout << "解放回数:" << num << "\n"; cout << "\n"; } Basic& operator=(const Basic& bc) { id = bc.id; name = bc.name; job = bc.job; return *this; } };// class Basic ostream& operator<<(ostream &s, const Basic bc) { s << "番号:" << bc.id << "\n" << "名前:" << bc.name << "\n" << "職業:" << bc.job << "\n"; cout << "\n"; return s; }
Student.h #include <iostream> #include <string> #include "Basic.h" #define NUM_C 5 using namespace std; class Student :public Basic { public: //メンバ変数 unsigned int grade; unsigned int credits; string certificate[NUM_C]; public: //コンストラクタ(引数無し) Student() { id = "0"; } Student(string id_in, string name_in, string job_in, unsigned int grade_in, unsigned int credits_in, string certificate_in[]) { setStatus(id_in, name_in, job_in, grade_in, credits_in, certificate_in); } public: //メンバ関数 // メンバ変数に値を設定 void setStatus(string id_in, string name_in, string job_in, unsigned int grade_in, unsigned int credits_in, string certificate_in[]) { Basic::setStatus(id_in, name_in, job_in); grade = grade_in; credits = credits_in; for (int i = 0;i < NUM_C;i++) { certificate[i] = certificate_in[i]; } } // メンバ変数表示 void statusOpen(void) { cout << "Basicクラスのメンバ変数\n"; BasicCharacter::statusOpen(); cout << "Studentクラスのメンバ変数\n"; cout << "年数:" << grade << "\n"; cout << "獲得単位:" << credits << "\n"; cout << "資格:"; for (int i = 0;i < NUM_C;i++) { cout << certificate[i] << ","; } cout << "\n"; cout << "\n"; } };//class Student:Basic
Transmigration.h #include <iostream> #include <string> #include "Student.h" using namespace std; class Transmigration :public Student { //メンバ変数 public: unsigned char rank; //個人ランク string race; //種族 string job2[5]; //職業 unsigned int strength; //力 unsigned int intelligence; //知恵 unsigned int vitality; //体力 unsigned int agility; //素早さ unsigned int luck; //運 string skill[5]; //スキル //コンストラクタ public: Transmigration() { id = "0"; } Transmigration(string id_in, string name_in, string job_in, unsigned int grade_in, unsigned int credits_in, string certificate_in[], unsigned char rank_in, string race_in, string job2_in[], unsigned int strength_in, unsigned int intelligence_in, unsigned int vitality_in, unsigned int agility_in, unsigned int luck_in, string skill_in[]) { setStatus(id_in, name_in, job_in, grade_in, credits_in, certificate_in, rank_in, race_in, job2_in, strength_in, intelligence_in, vitality_in, agility_in, luck_in, skill_in); } Transmigration(Student person){ }//使用するコンストラクタ //メンバ関数 public: // メンバ変数に値を設定 void setStatus(string id_in, string name_in, string job_in, unsigned int grade_in, unsigned int credits_in, string certificate_in[], unsigned char rank_in, string race_in, string job2_in[], unsigned int strength_in, unsigned int intelligence_in, unsigned int vitality_in, unsigned int agility_in, unsigned int luck_in, string skill_in[]) { Student::setStatus(id_in, name_in, job_in, grade_in, credits_in, certificate_in); rank = rank_in; race = race_in; strength = strength_in; intelligence = intelligence_in; vitality = vitality_in; agility = agility_in; luck = luck_in; for (int i = 0;i < 5;i++) { job2[i] = job_in[i]; skill[i] = skill_in[i]; } } // 各メンバ関数の値を表示 void StatusOpen(void) { cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"; Student::statusOpen(); cout << "Transmigrationクラスのメンバ変数\n"; cout << "ランク:" << rank << "\n"; cout << "種族:" << race << "\n"; cout << "第二職業:"; for (int i = 0;i < 5;i++) { cout << job2[i] << ","; } cout << "\n"; cout << "力:" << strength << "\n"; cout << "知恵:" << intelligence << "\n"; cout << "体力:" << vitality << "\n"; cout << "素早さ:" << agility << "\n"; cout << "運:" << luck << "\n"; cout << "スキル:"; for (int i = 0;i < 5;i++) { cout << skill[i] << ","; } cout << "\n"; } };//Transmigration:Student
main.cpp #include "Basic.h" #include "Student.h" #include "Transmigration.h" using namespace std; int main(int argc, char *argv[]) { Basic *person1; Basic *person2; Basic *person3; Student *person4; Transmigration *person5; string certificate4[NUM_C] = { "資格1","資格2","資格3","資格4","資格5" }; string certificate5[NUM_C] = { "資格6","資格7","資格8","資格9","資格10" }; //未使用 string certificate6[NUM_C] = { "職業1","職業2","職業3","職業4","職業5" }; string certificate7[NUM_C] = { "スキル1","スキル2","スキル3","スキル4","スキル5" }; //オブジェクト生成 person1 = new Basic("01", "satou", "なし"); person2 = new Basic(); person3 = new Basic(*person1); //コピーコンストラクタ person4 = new Student("04", "tanaka", "なし", 10, 100, certificate4); person5 = new Transmigration("05", "yamada", "なし", 50, 777, certificate6, 10, "人間", certificate6, 50, 60, 70, 80, 90, certificate7); //変数に値を設定 *person2 = *person1; //変数表示 person1->statusOpen(); person2->statusOpen(); cout << *person3; person4->statusOpen(); person5->statusOpen();  //オブジェクト破棄 delete person1; delete person2; delete person3; delete person4; delete person5; return 0; }// main

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

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

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

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

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

episteme

2019/08/24 11:18

コンパイルエラーになるが...
guest

回答2

0

ベストアンサー

class Transmigration のステータス出力関数の名前が"StatusOpen"で先頭が大文字になっています。
そのため、この関数がコールされずに基底クラスStudent の"statusOpen" (先頭小文字)が呼び出されているのだと思います。

person1~5の変数の型をBasic*にする場合に、statusOpen関数を呼び出す場合はvirtualをつける必要がありますが今回は該当しないと思います。

投稿2019/08/24 11:37

nomuken

総合スコア1627

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

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

pinno

2019/08/24 12:09

解決出来ました!ありがとうございます。
guest

0

メンバ関数をオーバーライドしたいようですね。
該当するメンバ関数の先頭にvirtualを記述してみてください。

オーバーライドとオーバーロードは全く別物
[メモ]継承と仮想関数

投稿2019/08/24 11:15

takapi_cs

総合スコア349

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問