c 預設繼承 C 之三種繼承方式的學習總結

2021-10-11 06:23:09 字數 3126 閱讀 9696

一、三種繼承方式:

1、從問題引出主題:

(1)冒號(:)表示繼承關係,parent表示被繼承的類,public的意義是什麼?

class parent

;class child : public parent

(2)是否可以將繼承語句中的public換成protected或者說private,因為寫**的時候,你肯定會有這樣的好奇心;同時如果可以這樣寫的話,那麼,這樣與public繼承又有什麼區別呢?咋們還是通過實際**來理解:

#include #include using namespace std;

class parent

;class child_a : public parent

;class child_b : protected parent

;class child_c : private parent

;int main()

試試看,能否編譯通過:

root@txp-virtual-machine:/home/txp# vim test.cpp

root@txp-virtual-machine:/home/txp# g++ test.cpp

root@txp-virtual-machine:/home/txp#

註解:通過編譯我們發現,完全沒有毛病。

2、c++中支援三種不同的基礎方式

public繼承:父類成員在子類中保持原有訪問級別

private繼承:父類成員在子類中變為私用成員

protected繼承:父類中的公有成員變為保護成員,其它成員保持不變。

繼承成員的訪問屬性:

=max

注意:c++中的預設繼承方式為private

**實踐:

#include #include using namespace std;

class parent

};class child_a : public parent

};class child_b : protected parent

};class child_c : private parent

};int main()

輸出結果:

root@txp-virtual-machine:/home/txp# ./a.out

m_a1

m_b1

m_c1

m_a4197200

m_b0

m_c4196272

m_a-903133344

m_b32766

m_c0

**實踐二:

#include #include using namespace std;

class parent

};class child_a : public parent

};class child_b : protected parent

};class child_c : private parent

};int main()

輸出結果:

root@txp-virtual-machine:/home/txp# g++ test.cpp

test.cpp: in function 『int main()』:

test.cpp:13:9: error: 『int parent::m_c』 is inaccessible

int m_c;

^test.cpp:63:7: error: within this context

b.m_c = 100; // child_b 保護繼承自 parent, 所以所有的 public 成員全部變成了 protected 成員, 因此外界無法訪問

^test.cpp:13:9: error: 『int parent::m_c』 is inaccessible

int m_c;

^test.cpp:64:7: error: within this context

c.m_c = 100; // child_c 私有繼承自 parent, 所以所有的成員全部變成了 private 成員, 因此外界無法訪問

^test.cpp:15:10: error: 『void parent::set(int, int, int)』 is inaccessible

void set(int a, int b, int c)

^test.cpp:67:18: error: within this context

b.set(2, 2, 2);

^test.cpp:67:18: error: 『parent』 is not an accessible base of 『child_b』

test.cpp:15:10: error: 『void parent::set(int, int, int)』 is inaccessible

void set(int a, int b, int c)

^test.cpp:68:18: error: within this context

c.set(3, 3, 3);

^test.cpp:68:18: error: 『parent』 is not an accessible base of 『child_c』

註解:當子類定義的物件,如果繼承關係不是public,那麼子類定義的物件,就無法訪問父類中的屬性和方法了。

3、遺憾的事實

一般而言,c++工程專案中只使用public繼承

c++的派生語言只支援一種繼承方式(public繼承)

protected和private繼承帶來的複雜性遠大於實用性

二、總結

c++中支援3種不同的繼承方式

繼承方式直接影響父類成員在子類中的訪問屬性

一般而言,工程中只使用public的繼承方式

c++的派生語言中支援public繼承方式

C 的繼承(三種繼承方式)

1.類的3種成員型別 2.三種繼承方式 1.類的三種成員型別 如圖所示 public protected private 三種成員型別,當沒表明型別的時候,預設是private的。類外部的意思是 main 函式啊,或者定義全域性變數的外部空間啊,其他類空間。如 下面的 是出錯的,因為a類的b變數是p...

C 三種繼承方式

公有繼承 public 私有繼承 private 保護繼承 protected 是常用的三種繼承方式。1.公有繼承 public 2.私有繼承 private 私有繼承的特點是基類的公有成員和保護成員都作為派生類的私有成員,並且不能被這個派生類的子類所訪問。3.保護繼承 protected 保護繼承...

C 三種繼承方式

繼承是使 可以復用的重要手段,也是物件導向程式設計的核心思想之一。簡單的說,繼承是指乙個物件直接使用另一物件的屬性和方法。繼承呈現了 物件導向程式設 計的層次結構,體現了 由簡單到複雜的認知過程。c 中的繼承關係就好比現實生活中的父子關係,繼承一筆財產比白手起家要容易得多,原始類稱為基類,繼承類稱為...