【C++】派生クラスの関数から親クラスの関数を呼び出す方法
C++では、親クラスと同じ名前の関数を派生クラスで再定義(オーバーライド)した場合でも、スコープ解決演算子「::」を使えば、派生クラスの関数の中から親クラスの関数を明示的に呼び出すことができます。
以下に、その基本的な例を示します。
サンプルコード
#include <bits/stdc++.h>
using namespace std;
class p1 {
public:
void first() {
cout << "\nThe parent class p1 function is called.";
}
};
class d1 : public p1 {
public:
void first() {
cout << "The derived class d1 function is called.";
p1::first();
}
};
int main() {
d1 d;
d.first();
return 0;
}
実行結果
The derived class d1 function is called. The parent class p1 function is called.
コードの解説
まず、親クラスとして p1 を定義し、その中に関数 first() を用意します。
class p1 {
public:
void first() {
cout << "\nThe parent class p1 function is called.";
}
};
次に、親クラス p1 を継承する派生クラス d1 を作成し、親クラスと同じ名前の関数 first() を再定義しています。
class d1 : public p1 {
public:
void first() {
cout << "The derived class d1 function is called.";
p1::first();
}
};
ポイントは、派生クラスの first() の中にある次の1行です。「クラス名::関数名」という形式で記述することで、親クラス p1 側の first() を呼び出せます。
p1::first();
main() 関数内で派生クラスのオブジェクト d に対して d.first() を呼び出すと、まず派生クラス側の処理が実行され、続いて p1::first() によって親クラス側の処理も実行されます。そのため、実行結果のように2つのメッセージが順に出力されるのです。
補足:仮想関数との関係
この手法は、対象の関数が仮想関数(virtual)であってもなくても使用できます。ただし、ポインタや参照を介して多態性(ポリモーフィズム)を利用する場合、virtual を付けた関数は実際のオブジェクトの型に応じて呼び出しが決まります。そのため、「基底クラスの共通処理を実行したうえで、派生クラス固有の処理を追加したい」といった場面では、p1::first() のように明示的に親クラスの関数を指定する書き方が非常に有効です。
-
C#で子クラスから基底クラスのコンストラクターを明示的に呼び出す方法
概要C#では、thisキーワードを使用することで、同じクラス内の別のコンストラクターを呼び出すことができます。一方、親クラス(基底クラス)側に存在するコンストラクターを呼び出したい場合は、baseキーワードを使用します。例基底クラスのコンストラクターを明示的に呼び出すには、派生クラスのコンストラクター宣言の後ろに「: base(引数)」を付けて呼び出します。以下のコードでは、派生クラス「Demo」のコンストラクターから、基底クラス「DemoBase」のコンストラクターを引数付きで呼び出しています。class DemoBase{ public Dem
-
MATLABからPython関数を呼び出す方法を徹底解説
MATLABでは、バージョン2014b以降からPythonライブラリが標準で利用できるようになりました。そのため、2014b以降のバージョンを使用していれば、MATLAB上で直接Pythonコードを実行することが可能です。PythonモジュールをMATLABで使う基本この機能により、MATLABの中でPythonモジュールを活用できます。特別な設定は一切不要で、使用したいPythonライブラリ名の前に「py」というプレフィックスを付けるだけで呼び出せます。ここでは、Pythonのcalendarモジュールを例に、うるう年の判定を行ってみましょう。py.calendar.isleap(2016)