改めて前回の内容をおさらいをしておくと、
- クラス内の変数や関数(メンバ)には、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講座 第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」
・MQL5 EA講座 第97回「トレーリングストップクラスを作る2」
・MQL5 EA講座 第100回「ブレイクイーブンストップ関数を作る」
※ツイッターでも派生クラスに関するつぶやきをまとめたモーメントがありますので、よろしければご利用ください。<m(__)m>
コメント