今回はオーバーライドにまつわるお話
其の壱 です。(^-^)
基底クラスのメンバ関数の再定義
基底クラスのメンバ関数は、派生クラスで
定義しなおすことができます。
この場合は、関数名、引数、戻り値が
同じでなければなりません。
定義しなおすと、そちらの関数が
呼ばれるようになります(^^)
ここでは、基底クラス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.・ケタリング
一種類以上の問題を無理に抱えようとするな。世の中には三種類も問題を抱えている
人がある-過去の問題のすべて、現在の問題のすべて、未来の問題のすべてを。
エドワード・エヴァレット・ヘール
私たちが敵に憎しみを感じると、むしろ自分自身が敵に支配されることになる。そして
その支配力は私たちの睡眠・食欲・血圧・健康・幸福にまで及んでくる。敵について
思い悩み、苦悶し、何とか仕返しの機会を狙っていると知ったら、敵は小躍りして
喜ぶであろう!私たちの憎悪は少しも敵を傷つけないばかりか、かえって私たち自身が
日夜、地獄の苦しみを味わうことになる。
デール・カーネギー