プロが教えるわが家の防犯対策術!

以下のC++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。
そして、ポリモーフィズムを使うメリットデメリットも教えてくださると幸いです。
#include <iostream>
#include <string>

using namespace std;

class CitizenCard
{
string name_;
int age_;

public:
CitizenCard() = delete;
CitizenCard(string const& name, int age): name_(name), age_(age) {}
friend ostream& operator<<(ostream& dst, CitizenCard const& me);
};

class TokyoGakuseiCard : public CitizenCard
{
int num_;
public:
TokyoGakuseiCard() = delete;
TokyoGakuseiCard(int num, string const& name, int age);
friend ostream& operator<<(ostream& dst, TokyoGakuseiCard const& me);
};

TokyoGakuseiCard::TokyoGakuseiCard(int num, string const& name, int age) : CitizenCard(name, age), num_(num) {}
ostream& operator<<(ostream& dst, CitizenCard const& me)
{
dst << "名前 :" << me.name_ << endl
<< "年齢 :" << me.age_ << endl;
return dst;
}

ostream& operator<<(ostream& dst, TokyoGakuseiCard const& me)
{
dst << "学籍番号:" << me.num_ << endl
<< static_cast<CitizenCard const&>(me) << endl;
return dst;
}

int main(int argc, char** argv)
{
TokyoGakuseiCard zibun(1, "Tokyo 太郎", 99);
cout << zibun;

return 0;
}

A 回答 (2件)

こういうコーディングレベルよりOOP設計のことを学ぶベき。



例えば何かのサーバーが有って、クライアントから電文を
受け取ると何か処理するとします。

電文は数十種類有るけど、サーバがクライアントに応答を返す物や
電文を受信するだけのもの、電文を送信するだけなものなどに
分類出来るとします。

こうした共通性を基に電文を処理するクラスを分類して行って
サーバの上位処理での幾つかの抽象クラスの振る舞いを決め、
個々の電文の処理の違いは、個々の具象クラスのメソッドのoverrdeで
吸収出来る様に、メソッドのインターフェースを
注意深く組み立ててゆきます。

この様に作ると、電文が増えてもサーバの上位処理に影響が及ぶことは
無くなります。処理プラグイン化などと呼ぶことも有りますが
ポリモーフィズムのアプリの構造レベルの応用のひとつです。
    • good
    • 0

今のままでもポリモーフィズムの考え方は所々に現れていると思いますよ。



ポリモーフィズムは、多態化といって、オブジェクトによって同名のメソッドの振る舞いを変化させることをいいます。
つまり、operator<<の振る舞いをクラスの型によって変えたりしているのは、ポリモーフィズム的な考え方ですね。

ポリモーフィズムには、派生クラスに基底クラスの機能を引き継がせつつ、派生クラスに自由度を与えられるというメリットがあります。

一方で、デメリットとは少し違いますが、注意点として基底クラスに変更が生じた場合、派生先できちんと整合性が取れるような設計をしなければ、後々対応に追われることになります。
例えば、今回の派生クラスのoperator<<の例で行くと、その中で基底クラスのoperator<<を呼び出していますが、もしこれをせずにname, ageの参照を直書きすると、基底クラスのメンバからこれらがなくなった場合に、派生クラスのoperator<からも削除する必要が出てきます。

きちんと定義と効果、注意点を認識してポリモーフィズムを使えばとても強力な概念ですね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!