基底クラスの関数やコンストラクタを呼び出す - C++ プログラミング

PROGRAM


基底クラスの関数を呼び出す方法

C++ には、他の言語でいう super のような、基底クラスのポインタを表すキーワードはありません。

基底クラスの関数を呼び出したい場合には、スコープ解決演算子 (::) を使って、その左側に基底クラスのクラス名を指定します。

size_t getLength()

{

return CBaseClass::getLength() + 10;

}

基底クラスが CBaseClass だった場合は、このようにして、基底クラス側で実装されている関数を呼び出すことができます。

 

基底クラスのコンストラクタを呼び出す方法

基底クラスを初期化する

クラスのコンストラクタの場合、C++ では派生先のクラスが構築されようとしたときには、何よりも先に基底クラスのコンストラクタが暗黙的に呼ばれるようになっているので、関数の時とは呼び方がだいぶ変わります。

たとえば CMyClass が CBaseClass を継承していた場合、CMyClass のコンストラクタを実装するときに、次のようにして基底クラスの初期化で使うコンストラクタを明記できます。

CMyClass::CMyClass() : CBaseClass(0, 10)

{

}

このように、プロトタイプ宣言で定義した CMyClass のコンストラクタ "CMyClass::CMyClass()" に続けて、記号 ":" を記載して、その後に基底クラスのコンストラクタと引数 "CBaseClass(0, 10)" を指定します。

ここで、初期化で使う基底クラスのコンストラクタの指定を省略した場合は、引数を取らないディフォルトコンストラクタが暗黙的に呼び出されます。

多重継承をしている場合は、それぞれのクラスについてのコンストラクタの呼び出しをカンマ区切りで指定できます。

 

メンバ変数を初期化する

ちなみにこの記載方法は、基底クラスのコンストラクタだけでなく、自分自身のメンバー変数の初期化でも使えます。

たとえば次のように、メンバー変数 "m_description" を持つクラス CMyClass が定義されていたとします。

class CMyClass : public CBaseClass

{

public:

CMyClass();

CMyClass(const std::string& description);

 

private:

std::string m_description;

}

このとき、CMyClass のディフォルトコンストラクタで m_description の値を初期化しておきたい場合には、ディフォルトコンストラクタの実装のところで、次のような書き方ができます。

CMyClass::CMyClass() : CBaseClass(0, 10), m_description("My Class")

{

}

書き方は基底クラスのコンストラクタの呼び出しと同じで、複数のメンバ変数を初期化したい場合には、それらをカンマ区切りで記載することができます。基底クラスのコンストラクタ呼び出しと混ぜて記載できます。

 

上記の例では std::string 型のメンバ変数を初期化しているので、指定したメンバ変数名 "m_description" に続く引数は、std::string クラスのコンストラクタに渡す値になります。

int 型などのメンバ変数を初期化することもできますが、このときも、たとえば "m_int(10)" のように、メンバー変数名に続けて引数のように初期値を指定します。


[ もどる ]