継承
今日はクラスの継承です。継承の宣言から、継承したメソッド・フィールドのアクセス制御まで。
継承の宣言
以下の形式で書きます。
class <派生クラス名> : [<継承修飾子>] <親クラス名> { ... };
簡単なサンプル。
#include <iostream> // 親クラス class Animal { private : char *name; public : char *getName(); void setName( char *name ); }; char *Animal::getName() { return name; } void Animal::setName( char *name ) { this->name = name; } // 派生クラス // class <派生クラス名> : [<継承修飾子>] <親クラス名> { ... }; の形式で宣言する。 class Kitten : public Animal { int age; public : int getAge(); void setAge( int age ); void meow () { std::cout << this->getName() << ":" << this->age << std::endl; } }; int Kitten::getAge() { return age; } void Kitten::setAge( int age ) { this->age = age; } // メイン関数 int main() { Kitten kitten; kitten.setAge(1); kitten.setName("mii"); kitten.meow(); return 0; }
実行結果です。
mii:1
継承したメソッド・フィールドのアクセス制御
Javaでは、親クラスのフィールドやメソッドで指定したアクセス修飾子(publicやprotectedなど)により、継承したメソッドなどのアクセス範囲が決まりますが、C++では継承時に指定する「継承修飾子」の影響も受けます。継承修飾子には、「public」と「private」があります。
- private派生した場合、
- public派生した場合
- Javaと同じ。
- 親クラスのprivateメンバーは派生クラスからもアクセスできない。(private派生、public派生とも。)Javaと同じですね。
- デフォルトはprivate派生。(Javaになれた人は注意。)
private派生の場合
親のprivate | 親のprotected | 親のpublic | 自身のprivate | 自身のprotected | 自身のpublic | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
派生クラス自身から | × | ○ | ○ | ○ | ○ | ○ | |||||||
他のクラスから | × | × | × | × | × | ○ |
public派生の場合
親のprivate | 親のprotected | 親のpublic | 自身のprivate | 自身のprotected | 自身のpublic | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
派生クラス自身から | × | ○ | ○ | ○ | ○ | ○ | |||||||
他のクラスから | × | × | ○ | × | × | ○ |
ややこい。