1.クラスの派生
1)定義:
継承関係では、継承されたクラスは基本クラス(または親クラス)と呼ばれ、継承関係によって定義された新しいクラスは派生クラス(またはサブクラス)と呼ばれます。
2)機能:
派生クラスは、元のクラスのメンバーを継承できるだけでなく、新しいメンバーを追加することもできます
。3)継承の一般的な形式:たとえば
、クラスはすでに存在します。
class employee{
//....
}
このクラスを継承する必要のクラスtearcher;
そして:
class teacher:public employee{
//.....
}
4)サブクラスは、親クラスのメンバーメソッドを書き換えることができ、関数の戻り値の型、関数名、およびパラメーターリストが一貫している必要があります。
コード:
#include<stdio.h>
#include<iostream>
using namespace std;
class employee{
//父类
protected:
char *name;
int age;
char sex;
public:
//....
void print(){
//父类中的一个方法
cout<<"name:"<<name<<endl;
cout<<"age:"<<age<<endl;
cout<<"sex:"<<sex<<endl;
}
};
class teacher:public employee//子类 继承父类,父类的成员自动被继承
{
private:
char *title;
//...
public:
//...
void print(){
cout<<"name:"<<name<<endl;
cout<<"age:"<<age<<endl;
cout<<"sex:"<<sex<<endl;
cout<<"title:"<<title<<endl;
}
};
int main(){
//...
return 0;
}
2.派生クラスと基本クラスの関係
派生クラスの定義:
class 派生类名:[继承方式] 基类名
C ++クラスの継承メソッド:プライベート、保護、パブリック継承。
継承メソッドが異なると、基本クラスのメンバーを継承するときに、派生クラスの特性が異なる可能性があります。
1.
プライベート継承:
親クラスのパブリックメンバーと保護されたメンバーが子クラスでプライベートになります
。2。
パブリック継承:
親クラスのメンバー属性が子クラスで変更されません。3
。
保護継承:
親クラスのメンバーサブクラスは保護されます
。4。
継承に関係なく、親クラスのプライベートメンバーは継承できません。!!データのカプセル化のアイデアを反映して、
5
クラスのキーワードで定義されたクラスの既定の継承方法は、プライベートで、構造体で定義されたクラスの既定の継承方法はpublicです。クラスのデフォルトのアクセス方法と一致している。それを記録する。
**
コード:
#include<stdio.h>
#include<iostream>
using namespace std;
class Base{
private:
int a,b;
public:
int getA(){
return a;
}
};
class Derived:public Base{
public:
int getD(){
//调用父类的public方法;
getA();
}
};
int main()
{
//...
return 0;
}
3.派生クラスのコンストラクタとデストラクタ
**
1)派生クラスのコンストラクター:派生クラス
のオブジェクトを作成する場合、派生クラスのオブジェクトにはクラスのデータメンバーが含まれているため、派生クラスのコンストラクターは独自の定義のデータメンバーを初期化する必要があります、および基本クラスの機能も実行する必要があります。のデータメンバーは初期化されます。つまり、派生クラスのコンストラクターは、基本クラスのコンストラクターを呼び出す責任があります。
2)派生クラスコンストラクターの一般的な形式:
派生クラスコンストラクター関数名(パラメーターリスト):基本クラスコンストラクター関数名(パラメーターリスト){...}
初期化リストを使用して、基本クラスのデータメンバーを初期化します。
コード:
#include<iostream>
using namespace std;
class Base{
int x,y;
public:
Base(int a,int b){
x=a;
y=b;
cout<<"construct Base"<<endl;
}
~Base(){
cout<<"destruct Base"<<endl;
}
};
class SonClass:public Base{
public:
SonClass(int z):Base(z,z)
{
cout<<"construct SonClass"<<endl;
}
~SonClass(){
cout<<"destruct SonClass"<<endl;
}
};
int main()
{
SonClass oo(8);
return 0;
}
演算結果:
construct Base
construct SonClass
destruct SonClass
destruct Base
1.サブクラスコンストラクタの実行手順:最初に親クラスコンストラクタを実行し、次に独自のコンストラクタを実行します
。2。サブクラスデストラクタ実行プロセス:最初に独自のデストラクタを実行し、次に親クラスのデストラクタを実行します。
この考え方はスタックに似ています。ファーストインラストアウトの原則;
**
4.多重継承と仮想基本クラス
**
1.単一継承:
派生クラスには親クラスが1つだけあり、この形式は単一継承であり、そのクラス階層はツリーとして表現できます。
2.多重継承:
C ++では、サブクラスに多重継承と呼ばれる複数の親クラスを含めることができます。多重継承の基本クラスと派生クラスは、有向グラフ構造に編成できます。
(多重継承派生クラスの宣言方法は、宣言時のリストであることを除けば、単一継承の宣言方法と似ています)。
class派生クラス:<派生メソッド>基本クラス1、<派生メソッド>基本クラス2、...、<派生メソッド>基本クラスn
{ // ... }
3.仮想基本クラス:
多重継承を解決できる基本クラスのメンバーコピー;
実装メソッド:
クラス派生クラス:仮想<派生メソッド>基本クラス... { // ... }コード:
#include<iostream>
using namespace std;
class A{
public:
int x,y;
};
class B:virtual public A{
int z;
};
class C:virtual public A{
int a;
};
class D:public B,public C{
};
//D d;此时可以直接使用d.x,不再有二义性!
int main()
{
D d;
cin>>d.x;
cin>>d.y;
cout<<"x="<<d.x<<endl;
cout<<"y="<<d.y<<endl;
return 0;
}
多重継承はダイヤモンド継承(あいまいさ)の問題につながり、仮想基本クラスを使用することでそれを解決できます!