2013年12月18日水曜日

C++ 派生クラスと基底クラス 其の弐


今回は、派生クラスのオブジェクトのアドレスを
基底クラスのポインタに代入するとどうなるのか、
について見ていきます(^^)

子オブジェクトのアドレスを親クラスのポンタに代入してみると
何と派生クラスのオブジェクトのアドレスを、
基底クラスのポインタに代入するといった
使い方もできます。





class Food  //基底クラス
{
public:
    void SetPrice(int price);
    int GetPrice(void);
private:
    int m_price;
};

class Vegetable : public Food //派生クラス
{
public:
    void SetFarmName(const char *farm);
    char *GetFarmName(void);
private:
    char m_strFarmName[32];
};
   :
   :
int main(void)
{
    Food *pFood;         //Foodクラスのポインタ
    Vegetable myVegetable;  //Vegetableクラスのオブジェクト

    pFood = &myVegetable;  //Vegetableクラスのオブジェクトのアドレスを
                                        //Foodクラスのポインタに代入
    return 0;
}


使い方をもっと具体的に
基底クラスのポンタ配列に派生クラスからのオブジェクトのアドレスを代入しておくと、
派生クラスのメンバ関数を基底クラスのポインタから呼び出すことができます(^^)
以前のサンプルプログラムを以下のように変更します。

    :
class Meet : public Food    //新しい派生クラスMeetを追加
{
public:
    void SetFarmName(const char *farm);
    char *GetFarmName(void);
private:
    char m_strFarmName[32];
};
    :
int main(void)
{
    Food *pFood[2];
    Vegetable myVegetable;
    Meet myMeet;

    pFood[0] = &myVegetable;
    pFood[1] = &myMeet;

    for (int i = 0; i < 2; i++) {
        pFood[i]->SetPrice((i+1) * 100);
        cout << "Price[" << i << "]="<<  pFood[i]->GetPrice() << endl;
    }

    return 0;
}

実行結果
# ./test
Price[0]=100
Price[1]=200

継承に限らず、ポインタを駆使した処理というのは沢山でてきますので
ぜひとも身につけておきたいところです(^^;)


今日の名言
いらぬ取り越し苦労をするよりも、前もって考えたり計画する方が大事だ。
                                ウィンストン・チーチャル

大きな悲しみには勇気をもって立ち向かい、小さな悲しみには忍耐をもって立ち向かえ。
一日の仕事を終えたら安らかに眠れ。あとは神が守ってくださる。
                                ヴィクトル・ユーゴー

小さな事柄が人を悩ませるのだ。象が向って来れば身をかわして逃げられもするが、
ハエからは身をかわすことはできない。
                                ジョシュ・ビリングス

人間を殺すのは仕事ではない。悩みである。仕事は健康に良い。けれど自分の力の
限界以上に働くことはできない。悩みは歯車の錆である。機械が駄目になるのは、
絶えず回転するからではなく、絶えず摩擦するからである。
                                ヘンリー・ウォード・ビーチャー