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

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

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

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

Q&A

4回答

1971閲覧

継承について

wug

総合スコア13

C++

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

0グッド

1クリップ

投稿2015/06/06 11:54

この課題はプログラムAをもとにしてプログラムBのクラス定義を完成させることです
条件としてmain関数は同じで出力結果も同じです

//出力結果
AIFLの貸出高は2000億円
TADANOの製造物はcrane

クラスCompanyのインスタンス変数nameをどうやって使えばいいのかが分かりません

lang

1**プログラムA** 2#include <iostream> 3#include <string> //文字列操作用クラス 4using namespace std; 5 6//金融業クラス定義 7class Finance { 8 string name; //会社名 9 int loan; //貸出高(億円) 10public: 11 Finance(string fname = "", int floan = 0) 12 : name(fname), loan(floan){} 13 string getName()const{ return name; } 14 int getLoan()const{ return loan; } 15}; 16///////////////////////////////////////////////////// 17//製造業クラス定義 18class Production { 19 string name; //会社名 20 string product; //製造物 21public: 22 Production(string pname = "", string pproduct = "") 23 : name(pname),product(pproduct){} 24 string getName()const{ return name; } 25 string getProduct()const{ return product; } 26}; 27///////////////////////////////////////////////////// 28int main() 29{ 30 Finance* financeP(new Finance("AIFL", 2000)); 31 Production* productionP(new Production("TADANO", "crane")); 32 33 cout << financeP->getName() << "の貸出高は" 34 << financeP->getLoan() << "億円" << endl; 35 cout << productionP->getName() << "の製造物は" 36 << productionP->getProduct() << endl; 37 38 delete financeP; 39 delete productionP; 40 return 0; 41}

lang

1**プログラムB** 2#include <iostream> 3#include <string> //文字列操作用クラス 4using namespace std; 5 6//会社クラス定義 7class Company { 8 string name; //会社名 9public: 10 11 12 13}; 14//金融業クラス定義 15class Finance : public Company { 16 int loan; //貸出高(億円) 17public: 18 19 20 21}; 22///////////////////////////////////////////////////// 23//製造業クラス定義 24class Production : public Company { 25 string product; //製造物 26public: 27 28 29 30}; 31///////////////////////////////////////////////////// 32int main() 33{ 34 Finance* financeP(new Finance("AIFL", 2000)); 35 Production* productionP(new Production("TADANO", "crane")); 36 37 cout << financeP->getName() << "の貸出高は" 38 << financeP->getLoan() << "億円" << endl; 39 cout << productionP->getName() << "の製造物は" 40 << productionP->getProduct() << endl; 41 42 delete financeP; 43 delete productionP; 44 return 0; 45}

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

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

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

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

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

guest

回答4

0

このままでは、Finance Product の name はCompanyの name と別扱いされると思います。private でなくとも隠されますし。(メンバは private が良いが。)
Company の public: 内でゲッターメソッドを作り、FinanceやProduct ではそれを呼ぶ形がよいかと思います。virtual にすべきか否かは状況によります。
また、継承クラスのコンストラクタから親クラスのコンストラクタを呼ぶことができるので、それも意図した課題ではないかと思います。
もし、会社名を省略できない場合(そうでなくともコンストラクタが1引数である可能性があるので)コンストラクタに explicit も付けた方が安全です。

投稿2019/06/05 11:26

編集2019/06/05 13:40
myoon

総合スコア100

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

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

0

まず 継承の根本的な事を覚えましょう

プログラムBは、
Companyというclassと、Companyを継承したFinance、Companyを継承したProductionクラスを作ります

Companyには string name;があり、getName()で取得します
Financeには、int loan;があり getLoan()で取得
Productionには、string product;があり getProduct()で取得

そういうコードになるでしょう

ここで プログラムAとの違いですが
継承を行うと、子供は 親クラスのpublicメソッドにアクセスする事ができます
ので Productionに nameというメンバ変数を作らず、親クラスのnameを使います

足りないコードは下記になります

親クラス Companyですが、getName() がないのでそれを実装しなければなりません
また、コンストラクタで nameを設定する必要があります

Financeは、getLoan()がないのでそれを実装
コンストラクタで loanの値を設定

Productionは、getProduct()がないのでそれを実装
コンストラクタで productの値を設定

これだけを実装すれば 大丈夫です

get関数はプログラムAを真似すれば書けます。

問題はコンストラクタです。

Companyは nameしか変数が無いので
Company(string fname="") : name(fname){} です。

Financeは、自分のメンバ変数はloanのみですが、引数に fnameとfloanをとり
fnameの値を親クラスのコンストラクタで設定しなければいけません
親クラスのコンストラクタを呼ぶには、コンストラクタの初期化子リスト内で
親クラス(引数) と書きます
ので
Finance(string fname="", int floan=0) : Company(fname), loan(floan){};
この Company(fname) 部分が、親クラスのコンストラクタを読んでいる部分となります

同様にProductも処理すれば 完成です

少し考えてみてわからなければ 再び質問してください


あと、余談ですが、new delete で生ポインタを使っていますが
C++では スマートポインタという物を使い、deleteミスを防ぎます
C++11では この場合は unique_ptrを使います
(古いC++では auto_ptrを使うしかありません)

ので、 #include<memory> を追加し
C++11では
auto f = unique_ptr<Finance>( new Finance("AIFL",2000));
古いC++では
auto_ptr<Finance> f = auto_ptr<Finance>( new Finance("AIFL",2000));
と書き、deleteしなくても、スコープを抜けると自動でdeleteしてくれるようになります

投稿2015/06/07 19:31

YukiMiyatake

総合スコア144

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

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

0

コンストラクタが無い気がするんですが...

投稿2015/06/06 16:36

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2015/06/06 17:01

変なこと言ったかと気になったので確認、 コンストラクタとgetメソッドを実装するだけですね。 mainの中でnewしている部分です。実装がありません。 nameはそこから派生元に飛ばします。 public: Production(string name, string product) : Company(name) { this->product = product; } string getProduct() { return product; } こんな感じのヤツです。
YukiMiyatake

2015/06/07 19:36

mrmthdtm さん 初めまして productの初期化ですが 上記でも動きますが コンストラクタの初期化子で初期化するほうが正しいのと プログラムAでは コンストラクタの引数はデフォルト引数なので その流儀にあわせ Production(string fname="", string fproduct=0) : Company(fname), product(fproduct){}; とするほうが良いとおもいます
guest

0

financeP->name
productionP->name
ででませんか?

class Company {
public:
string name; //会社名
}
もしかしたら、定義がこっちかもです。

投稿2015/06/06 14:42

MasaakiIrie

総合スコア1021

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

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

wug

2015/06/06 15:35

nameの定義はpublicではなくprivateで合っています
MasaakiIrie

2015/06/06 15:45

private にアクセスするのでしたら、ゲッターが必要ですね。 class Finance : public Company { int loan; //貸出高(億円) public:  string getName()const{ return name; } }
YukiMiyatake

2015/06/07 19:33

MasaakiIrie さん、はじめまして getNameは Companyクラスで公開すべきですので FinanceやProductクラスで作成すべきではありません。
MasaakiIrie

2015/06/08 00:27

YukiMiyatake さん たしかにその通りですね。 class Company { string name; //会社名 public:   string getName()const{ return name; } }; ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問