2013年12月23日月曜日

C++ メンバ関数の再定義


今回はオーバーライドにまつわるお話
其の壱 です。(^-^)

基底クラスのメンバ関数の再定義
基底クラスのメンバ関数は、派生クラスで
定義しなおすことができます。

この場合は、関数名、引数、戻り値が
同じでなければなりません。
定義しなおすと、そちらの関数が
呼ばれるようになります(^^)


ここでは、基底クラスFoodに対し、派生クラスVegetableで
SetPrice()関数を再定義してみます。

class Food
{
public:
    void SetPrice(int price);
    int GetPrice(void);
private:
    int m_price;
};

class Vegetable : public Food
{
public:
    void SetPrice(int price);
    void SetFarmName(const char *farm);
    char *GetFarmName(void);
private:
    char m_strFarmName[32];
};
   :
void Vegetable::SetPrice(int price)    //SetPrice()の再定義
{
    Food::SetPrice(price / 2); //半額にする
}

派生クラスから、基底クラスの関数を呼ぶときは
スコープ解決演算子を使います(^^)

実行結果
# ./test
Food Price = 500
Vegetable Price = 250

どうでしょうか、関数名が被ってもいいってのは、名前に悩まされる問題が
軽減される気がします。
なぜなら、機能が同じなのでそういった名前が付けたいに違いない!
と思うわけでして...(^^;)

せっかくなので、一応全部載せときます...
#include <iostream>
#include <string.h>

using namespace std;

class Food
{
public:
    void SetPrice(int price);
    int GetPrice(void);
private:
    int m_price;
};

class Vegetable : public Food
{
public:
    void SetPrice(int price);
    void SetFarmName(const char *farm);
    char *GetFarmName(void);
private:
    char m_strFarmName[32];
};

void Food::SetPrice(int price)
{
    m_price = price;
}

int Food::GetPrice(void)
{
    return m_price;
}

void Vegetable::SetPrice(int price)
{
    Food::SetPrice(price / 2);
}

void Vegetable::SetFarmName(const char *farm)
{
    strncpy(m_strFarmName, farm, 32);
}

char *Vegetable::GetFarmName(void)
{
    return m_strFarmName;
}

int main(void)
{

    Food myFood;
    Vegetable myVegetable;

    myFood.SetPrice(500);         //FoodクラスのSetPrice()
    myVegetable.SetPrice(500);    //VegetableクラスのSetPrice()

    cout << "Food Price = " << myFood.GetPrice() << endl;
    cout << "Vegetable Price = " << myVegetable.GetPrice() << endl;

    return 0;
}


今日の名言
問題を手際よく表現することによって、問題は半ば解決されている。
                                チャールズ・F.・ケタリング

一種類以上の問題を無理に抱えようとするな。世の中には三種類も問題を抱えている
人がある-過去の問題のすべて、現在の問題のすべて、未来の問題のすべてを。
                                エドワード・エヴァレット・ヘール

私たちが敵に憎しみを感じると、むしろ自分自身が敵に支配されることになる。そして
その支配力は私たちの睡眠・食欲・血圧・健康・幸福にまで及んでくる。敵について
思い悩み、苦悶し、何とか仕返しの機会を狙っていると知ったら、敵は小躍りして
喜ぶであろう!私たちの憎悪は少しも敵を傷つけないばかりか、かえって私たち自身が
日夜、地獄の苦しみを味わうことになる。
                                デール・カーネギー