class A{
int n;
public:
A(void){
n = 123;
/* コンストラクタの処理 */
}
};
と書く代わりに、
class A{
int n;
public:
A(void) : n(123) { /* コンストラクタの処理 */ }
};
と書くことが出来る。intのコンストラクタをA(void)が継承している、見れる。
/* in A.h */ class A{ int n; public: A(void); }; /* in A.cc */ A:A(void) : n(123) { /* コンストラクタの処理 */ }
となる。
#include実行結果class A{ protected; public: A(void){ std::cout << "A!" << std::endl; }
A(int n){ std::cout << "A : " << n << std::endl; }
};
class B : A{ public: B(void) { cout << "B!" << endl; } };
int main(void){ B* b = new B();
}
A! B!
でもこれはちょっと省略した書き方で、明示的にコンストラクタを指定するのが本流。
class B : A{
public:
B(void) : A() {
cout << "B!" << endl;
}
};
他のコンストラクタを呼ぶことも出来る。
class B : A{
public:
B(void) : A(1) {
cout << "B!" << endl;
}
};
実行結果
A : 1 B!
コンパイルすると、下のようなエラー。#include<iostream> class Hoge{//Hogeクラスの宣言 public: int foo; Hoge(int foo_){foo = foo_;} // コンストラクタ int print(void){std::cout << foo << '\n';} // print関数 };
class SuperHoge: public Hoge{// hogeを継承したSuperHogeクラスの宣言 public: SuperHoge(int foo_){foo = foo_ * foo_;}// コンストラクタ };
int main(){ SuperHoge sh(3); sh.print(); }
test.cc: In method `SuperHoge::SuperHoge(int)': test.cc:21: no matching function for call to `Hoge::Hoge ()' test.cc:7: candidates are: Hoge::Hoge(int) test.cc:15: Hoge::Hoge(const Hoge &)
SuperHogeを作る時は、まずHogeのコンストラクタが呼ばれ、さらにSuperHogeが呼ばれるのだが、 この書き方だと、呼ばれるHogeのコンストラクタには、引数は与えられないらしい。 なので、Hogeクラスの方にHoge(void){}というコンストラクタを定義する必要がある。
class Hoge{//Hogeクラスの宣言
public:
int foo;
Hoge(void){}
Hoge(int foo_){foo = foo_;} // コンストラクタ
int print(void){std::cout << foo << '\n';} // print関数
};
(追記) あるいは、下のように書くと、ちゃんとどのコンストラクタを継承するか指定できる。
class SuperHoge: public Hoge{// hogeを継承したSuperHogeクラスの宣言
public:
SuperHoge(int foo_) : Hoge(foo_) {foo = foo_ * foo_;}// コンストラクタ
};