C ++の継承
1;定義:
クラス継承は、すでにそこに既存のクラスから派生した新しいクラスの特徴です。元のクラスのいくつかは、新しいクラスを生成するときに、新しいクラスは、クラスの本来の機能が含まれますが、また、独自のすべての新機能を追加することができます。元のクラスは、新しいクラスが生成されたクラスを派生子と呼ばれ、親クラスと基底クラスと呼ばれています。
構文は次のように定義されています。
クラスの派生クラス:クラス名の継承グループ1、基底クラス名継承2、······
例えば:
class Base{
public;
int a=2;
};
class Derived:public Base{
public;
int b=3;
};
コードの外観をより簡潔にする:継承を使用する目的と効果。
2:3つの分類の継承
1:公共の継承
2:プライベート継承
3:保護された継承
1;公共の継承、クラス継承この時など、基本クラスのパブリック及び保護部材のメンバーは、派生クラスで同じプロパティにアクセスするために、基本クラスのプライベートメンバーが直接アクセスされません。
2; private継承:基底クラスのプライベートメンバーは、派生クラスで直接アクセスすることはできませんしながら、この時間は、基底クラスのpublicおよびprotectedメンバーのメンバーは、派生クラスのプライベートメンバーとして表示されたときに、クラスの継承があります。
3:継承を保護し、基底クラスのプライベートメンバーが直接アクセスすることはできませんしながら、基底クラスのpublicおよびprotectedメンバーのメンバーは、メンバーのアイデンティティを保護するために、派生クラスで表示されています。
3;タイプの互換性ルール:
どこ基底クラスのオブジェクトへの任意の必要性、オブジェクトがパブリック派生クラスを置き換えるために使用することができるが、交換後、派生クラスのオブジェクトは、基本クラスのオブジェクトとして使用することができますが、唯一の基本クラスのメンバから継承されました。
class B{.....}
class D:public B{.....}
B b1,*pb1;
D d1;
代替条件:
1、派生クラスのオブジェクトは、基本クラスオブジェクトに暗黙的に変換することができます。
b1=d1;
2、派生クラスのオブジェクトは、基本クラスを初期化するために参照することができます
B &rb=d1;
3、派生クラスのオブジェクトは、暗黙基本クラスのポインタに変換することができます。
pb1=&d1;
4:構造と派生クラスデストラクタ
1:コンストラクタ
注意事項:
1;派生クラス構成の目的は、オブジェクトを初期化するために、メンバとメンバオブジェクトベースクラスを追加する必要がある場合
2:基本クラスの初期化時には、パラメータテーブルを持つ基底クラスのコンストラクタを呼び出す必要がある場合、コンストラクタを宣言する必要があります
例えば:
#include <iostream>
using namespace std;
class Base{
public:
Base(){
cout << "Base的构造函数" << endl;
}
};
class Derived:public Base{
public:
Derived(){
cout << "Derived的构造函数" << endl;
}
};
int main()
{
Derived s;
}
原則:最初のメンバ変数を構造化、その後、親クラスを構築し、最終的に自分自身を構築します
2:デストラクタ
注意事項:
デストラクタを必要に応じて導出プロセスでは、基底クラスのデストラクタは、その後、我々は派生クラスで新しいデストラクタを宣言し、継承することはできません。
例えば:
#include <iostream>
using namespace std;
class Base{
public:
~Base(){
cout << "Base的析构函数" << endl;
}
};
class Derived:public Base{
public:
~Derived(){
cout << "Derived的析构函数" << endl;
}
};
int main()
{
Derived s;
}
原則:まず、分析では、最終的な破壊の親をグループメンバー変数を自分自身をデストラクタです。
要約すると、それは見ることができ、シーケンスコンストラクタとデストラクタは異なっています。
5:IDおよびアクセス承継の派生クラスのメンバ
注意事項;
1:継承階層ベースおよび派生クラスでは、独自のスコープを有します。
2:親クラスのサブクラスと同じ名前のメンバーは、親クラスのメンバーはまた、(サブクラスのメンバ関数では、あなたが使用することができ、「再定義」と呼ばれ、これは「隠された」と呼ばれ、同じ名前のメンバーに直接アクセスを保護しますサブクラス::基本クラスの基本クラスのメンバーがアクセスを表示)
3:関数名が隠さ構成と全く同じ、あなたはメンバ関数を隠している場合があります。:
4:実用的なエンジニアリングでは、継承システムは、同じ名前のメンバーを定義することが最善ではありません。
例えば:
class Person
{
protected:
string _name ="小明"; //姓名
int _num = 513030; //身份证号
};
class Student :public Person
{
public:
void Print(){
cout << "姓名: " << _name << endl;
cout << "身份证: " << Person::_num << endl;
cout << "学号: " << _num << endl;
}
protected:
int _num = 001; //学号
};
void Test()
{
Student s1;
s1.Print();
}
多重継承承継; 6
一般に、サブクラスが一つだけの親を持っているが、多重継承は、サブクラスを指す複数の親クラスを有しています。
例:同じ名前の多重継承は、隠されました
#include <iostream>
using namespace std;
class Base0{
public:
int var0;
void fun0()
{
cout <<"Member of Base0"<< endl;
}
};
class Base1:public Base0
{
public:
int var1;
};
class Base2:public Base0
{
public:
int var2;
};
class Derived:public Base1,public Base2{
public:
int var;
void fun()
{
cout <<"Member of Derived"<< endl;
}
};
int main()
{
Derived s;
s.Base1::var0=2;
s.Base1::fun0();
s.Base2::var0=3;
s.Base2::fun0();
return 0;
}