改めて前回の内容をおさらいをしておくと、
- クラス内の変数や関数(メンバ)には、private,protected,publicというアクセスレベルが設けられている。
- privateキーワードで指定された変数や関数は、その利用有効範囲が宣言したクラスの中に制限される。
- protectedキーワードで指定された変数や関数は、その利用有効範囲が、宣言したクラスと、派生クラスに制限される。
- publicキーワードで指定された変数や関数は、クラスの外からでもアクセスできる。
ということをお伝えしました。
今回は 派生クラス についてお話ししたいと思います。
※その前に。
ここまで3回にわたってクラスについての解説をしてきましたが、これまでの内容は押さえていますでしょうか?
「微妙だなー((+_+))」という部分があれば、以下のリンクで復習していただければと思います
- MQL5 EA講座 第48回「クラスについて1-クラスとは?-」
- MQL5 EA講座 第49回「クラスについて2 -クラスの使い方-」
- MQL5 EA講座 第50回「クラスについて3 -アクセス指定子-」
派生クラスとは?
クラスの大きな特徴の1つに、
継承(inheritance)
という概念があります。
継承とは?
継承を簡単に言うと、特定のクラスの機能を引き継ぎつつ、さらに新しい機能をクラスに追加できる機能です。
このような、特定のクラスを継承したクラスを派生クラスと言います。
現時点ではピンとこないかもしれませんが、大丈夫です。コードの具体歴を見ていきながらゆっくりと理解していきましょう。
派生クラスの作り方
前回のアクセス指定子の記事でも、派生クラスの作り方については簡単に触れました。
classキーワード→ 派生クラス名 →コロン(:) →public 派生元のクラス名
という記述手順を踏んで派生クラスは作られます。↓
//クラスの宣言
class exampleClass
{
protected:
//アクセスレベルprotectedのメンバー変数「protectedVariable」を宣言
int protectedVariable;
public:
//アクセスレベルpublicのメンバー変数「publicVariable」を宣言
int publicVariable;
//アクセスレベルpublicのメンバー関数「publicFunction1」を宣言
int publicFunction1(){return protectedVariable;};
//アクセスレベルpublicのメンバー関数「publicFunction2」を宣言
void publicFunction2(){Print(protectedVariable);};
};
//派生クラスの宣言
class derivedClass : public exampleClass
{
}
上のサンプルコード記述によって、exampleClassを継承した派生クラスderivedClassが誕生しました。
注目してほしいのは、この時点では派生クラスderivedClassにはメンバを一切記述していないことです。
//派生クラスの宣言
class derivedClass : public exampleClass
{
}
じゃあ、これからメンバを書き込んでいかないと、derivedClassは何も機能しないのか?
というとそんなことはなくて、exampleClassを継承しているので、exampleClassのメンバが使えるようになっています。(privateレベル以外)
class exampleClass
{
protected:
//アクセスレベルprotectedのメンバー変数「protectedVariable」を宣言
int protectedVariable;
public:
//アクセスレベルpublicのメンバー変数「publicVariable」を宣言
int publicVariable;
//アクセスレベルpublicのメンバー関数「publicFunction1」を宣言
int publicFunction1(){return protectedVariable;};
//アクセスレベルpublicのメンバー関数「publicFunction2」を宣言
void publicFunction2(){Print(protectedVariable);};
};
//派生クラスの宣言
class derivedClass : private exampleClass
{
/* ↓実際はこれらのexampleClassメンバーにアクセスできる!
protected:
int protectedVariable;
public:
int publicVariable;
int publicFunction1(){return protectedVariable;};
void publicFunction2(){Print(protectedVariable);};
*/
};
派生クラスderivedClassは{}内にメンバの記述をしていなくても、exampleClassから継承を受けているので、実際は↑のサンプルコードで/**/マルチラインコメントアウトしている部分のメンバを実装しています。
下記の動画は、メンバを一切記述していない状態の派生クラスから継承元のメンバを呼び出している様子です。OnStart関数から無事exampleClassのメンバを呼び出せているのがわかると思います。↓
派生クラスの拡張性について
このように、派生クラスを作ることによって、継承元のメンバを使えるようになるわけですが、派生クラスは自分のメンバを追加してさらにクラスの機能を拡張することができます。
//クラスの宣言
class exampleClass
{
protected:
//アクセスレベルprotectedのメンバー変数「protectedVariable」を宣言
int protectedVariable;
public:
//アクセスレベルpublicのメンバー変数「publicVariable」を宣言
int publicVariable;
//アクセスレベルpublicのメンバー関数「publicFunction1」を宣言
int publicFunction1(){return protectedVariable;};
//アクセスレベルpublicのメンバー関数「publicFunction2」を宣言
void publicFunction2(){Print(protectedVariable);};
};
//派生クラスの宣言
class derivedClass : public exampleClass
{
public:
//アクセスレベルpublicのメンバー変数「derivedVariable」を宣言
double derivedVariable;
//アクセスレベルpublicのメンバー関数「derivedFunction」を宣言
double derivedFunction(){return derivedVariable;}
};
derivedClassにメンバ「derivedVariable」とメンバ「derivedFunction」を追加しました。
見た目上はderivedClassには、2つのメンバしかないように見えますが、先述した通りexampleClassのメンバも継承しているので、derivedClassからは6つのメンバが呼び出せます。
おまけ
前回と今回の講座を通じて、アクセス指定子には2パターンあることに気づかれましたでしょうか?
すなわち、
(1)アクセス指定子には基本クラスのメンバに対して用いるものと、
(2)派生クラス宣言時に用いるもの
です。
classキーワード→ 派生クラス名 →コロン(:) →private→派生元のクラス名
という記載順で派生クラスを作った場合、継承したメンバのアクセスレベルは全てprivateになります。
↓の動画を見るとわかるように、publicの時は通っていたコンパイルがprivateに変えるとアクセス権消失でエラーになっています
この原理は、protected にも同様に適用されます。
派生クラスの宣言時、
classキーワード→ 派生クラス名 →コロン(:) →protected →派生元のクラス名
とすると、
継承したメンバのアクセスレベルは全てprotected になります。
じゃあ、public にするとどうなるか・・・というと、継承したメンバのアクセスレベルは基本クラスのアクセスレベルをそのまま引き継ぎます。これが最もオーソドックスな使い方になります。
というより、継承元のメンバのアクセスレベルをprivateやprotectedに変更するメリットを差し当たっては思いつきません。
※派生クラスの具体的な使い方については↓
・MQL5 EA講座 第109回「インジケータの値を簡単に取得できるクラスを作る」
・MQL5 EA講座 第110回「インジケータ取得クラスに派生クラスを追加する」
で確認する事ができます。
今回は以上になります。
最後までお読みいただきありがとうございました<m(__)m>
【超入門】MQL5 EA講座 第50回「クラスについて3 -アクセス指定子-」【EAの作り方】←
→【超入門】MQL5 EA講座 第52回「クラスについて5 -コンストラクタ-」【EAの作り方】
※クラスの実際の使用例に関しては、今後の講座記事にはなりますが、以下の記事で解説していますので、今はよくわからなくてもご安心ください。
・MQL5 EA講座 第71回「トレード用のオリジナルクラスを作る」
・MQL5 EA講座 第82回「ポジション情報管理クラスを作る-その1」
・MQL5 EA講座 第83回「ポジション情報管理クラスを作る-その2」
・MQL5 EA講座 第88回「待機注文情報取得用のクラスを追加する」
・MQL5 EA講座 第96回「トレーリングストップクラスを作る1」
コメント