繼承是一個重用和擴充現有類而無需修改該類的機制,從而在兩者之間形成層級關係。
繼承差不多是吧一個對象嵌入到另外一個對象。假設你在類 B 的定義中聲明類 A 的一個對象 x 對象,結果,類 B 將能夠訪
問類 A 所有的公用的資料成員以及成員函數。然而,在類 B 中,你想要訪問類 A 的所有的公用資料成員以及成員函數,需
要通過類 A 的對象 x。 下面的例子樣本這些:
1 #include <iostream>
2 using namespace std;
3
4 class A {
5 int data;
6 public:
7 void f(int arg) { data = arg; }
8 int g() { return data; }
9 };
10
11 class B {
12 public:
13 A x;
14 };
15
16 int main() {
17 B obj;
18 obj.x.f(20);
19 cout << obj.x.g() << endl;
20 // cout << obj.g() << endl;
21 }
在主函數中,對象 obj 利用語句 obj.x,f(20) 通過它的資料成員 B::x 訪問函數 A::f()。 對象 obj 利用語句 obj.x.g()
以類似的方式訪問 A::g()。 由於 g() 是類 A 的成員函數,而不是類 B 的成員函數,編譯器將不允許語句 obj.g() 通過。
繼承機制允許你使用相似於上面例子中的語句 obj.g() 。為了讓該語句合法, g() 必須是類 B 的成員函數。
繼承允許你將另外一個類成員的名稱以及定義作為新類的一部分。某個類,你想將其成員包含到你的新類,這個類稱為基類。
下面的例子和上面的例子一樣,除了它用了繼承機制,允許類 B 訪問類 A 的成員。
1 #include <iostream>
2 using namespace std;
3
4 class A {
5 int data;
6 public:
7 void f(int arg) { data = arg; }
8 int g() { return data; }
9 };
10
11 class B : public A { };
12
13 int main() {
14 B obj;
15 obj.f(20);
16 cout << obj.g() << endl;
17 }
類 A 是類 B 的基類。 類 A 成員變數的名稱和定義都包含在類 B 的定義中。類 B 繼承類 A 的成員。類 B 是類 A 的派生
類。 類 B 包含 A 類型的子物件。
你可以同樣添加新的資料成員和成員函數到衍生類別。你可以通過覆蓋基類成員函數或者資料在新派生的類中修改已經存在的成
員函數或者資料。
你可以從其他衍生類別中派生新類,從而建立另外一個層級的繼承。下面的例子樣本這些:
1 struct A { };
2 struct B : A { };
3 struct C : B { };
類 B 是類 A 的衍生類別,但是同時是類 C 的基類。 繼承的層級僅僅受限於資源。(也就是說,只要記憶體足夠,我們就可以無
限制派生)
多重繼承允許你建立一個衍生類別,其從多個基類繼承屬性。因為一個衍生類別繼承所有的基類成員,有可能導致混淆(形成衝突
)。例如,如果兩個基類包含具有相同名稱的變數,衍生類別不能隱式確定兩個變數的差異。注意,當你使用多繼承,訪問基類
成員的名稱可能會形成混淆。
直接基類:就是一個衍生類別在聲明的時候,直接緊跟在“:”號後面的類。
間接基類:
1 class A {
2 public:
3 int x;
4 };
5 class B : public A {
6 public:
7 int y;
8 };
9 class C : public B { };
類 B 是一個類 C 的直接基類。 類 A 是類 B 的直接基類。 類A 是類 C 的間接基類。(類 C 擁有 成員變數 x 和 y)
Polymorphic functions are functions that can be applied to objects of more than one type.
多態函數指的是可以被應用多種資料類型的函數。在C++中, 多態函數有兩種實現方式:
- 重載函數——在編譯期間靜態繫結。
- C++提供的虛函數。虛函數在運行期間動態綁定。