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

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

ただいまの
回答率

87.80%

継承について

受付中

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 1,573

score 13

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

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

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

**プログラムA**
#include <iostream>
#include <string>                   //文字列操作用クラス
using namespace std;

//金融業クラス定義
class Finance {
    string name;                    //会社名
    int loan;                        //貸出高(億円)
public:
    Finance(string fname = "", int floan = 0)
                                   : name(fname), loan(floan){}
    string getName()const{ return name; }
    int getLoan()const{ return loan; }
};
/////////////////////////////////////////////////////
//製造業クラス定義
class Production {
    string name;                    //会社名
    string product;                 //製造物
public:
    Production(string pname = "", string pproduct = "")
                                    : name(pname),product(pproduct){}
    string getName()const{ return name; }
    string getProduct()const{ return product; }
};
/////////////////////////////////////////////////////
int main()
{
    Finance* financeP(new Finance("AIFL", 2000));
    Production* productionP(new Production("TADANO", "crane"));

    cout << financeP->getName() << "の貸出高は"
          << financeP->getLoan() << "億円" << endl;
    cout << productionP->getName() << "の製造物は"
          << productionP->getProduct() << endl;

    delete financeP;
    delete productionP;
    return 0;
}

**プログラムB**
#include <iostream>
#include <string>                   //文字列操作用クラス
using namespace std;

//会社クラス定義
class Company {
    string name;                    //会社名
public:



};
//金融業クラス定義
class Finance : public Company {
    int loan;                        //貸出高(億円)
public:



};
/////////////////////////////////////////////////////
//製造業クラス定義
class Production : public Company {
    string product;                 //製造物
public:



};
/////////////////////////////////////////////////////
int main()
{
    Finance* financeP(new Finance("AIFL", 2000));
    Production* productionP(new Production("TADANO", "crane"));

    cout << financeP->getName() << "の貸出高は"
          << financeP->getLoan() << "億円" << endl;
    cout << productionP->getName() << "の製造物は"
          << productionP->getProduct() << endl;

    delete financeP;
    delete productionP;
    return 0;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/07 00:35

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

    キャンセル

  • 2015/06/07 00:45

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

    キャンセル

  • 2015/06/08 04:33

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

    キャンセル

  • 2015/06/08 09:27

    YukiMiyatake さん
    たしかにその通りですね。

    class Company {
    string name; //会社名
    public:
      string getName()const{ return name; }
    };
    ですね。

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/07 02:01

    変なこと言ったかと気になったので確認、
    コンストラクタとgetメソッドを実装するだけですね。

    mainの中でnewしている部分です。実装がありません。
    nameはそこから派生元に飛ばします。

    public:
    Production(string name, string product) : Company(name)
    {
    this->product = product;
    }
    string getProduct() { return product; }

    こんな感じのヤツです。

    キャンセル

  • 2015/06/08 04:36

    mrmthdtm さん 初めまして
    productの初期化ですが 上記でも動きますが
    コンストラクタの初期化子で初期化するほうが正しいのと
    プログラムAでは コンストラクタの引数はデフォルト引数なので
    その流儀にあわせ

    Production(string fname="", string fproduct=0) : Company(fname), product(fproduct){};

    とするほうが良いとおもいます

    キャンセル

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してくれるようになります

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る