【C++深度剖析教程24】C++中不同的继承方式
生活随笔
收集整理的這篇文章主要介紹了
【C++深度剖析教程24】C++中不同的继承方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
過完年了,今天開始寫博客記錄學習的過程。繼續C++的學習,今天我們來看C++中不同的繼承方式。
一、初探繼承的方式
從上圖看,是否可以將繼承中的public換成protected或者private。如果可以,它們與public繼承的區別是什么?
下面寫一個程序做一個試驗就知道了:
#include <iostream> #include <string>using namespace std;class Parent { };class Child_A : public Parent { };class Child_B : protected Parent { };class Child_C : private Parent { };int main() { return 0; }在Linux下編譯該程序,編譯通過,說明上述程序內有問題,那么也就是說繼承可以用public,protected,private修飾。它們的各自的性質如下:
public繼承:
*父類成員在子類中保持原有的訪問級別private繼承:
*父類成員在子類成員中變為私有成員protected繼承:
*父類成員的公有成員在子類中變為保護成員,其他成員保持不變
總結一下,就是如下表的內容:
二、深入寫代碼
上面介紹了繼承的訪問級別,下面我們就來深入寫一個相關代碼,來更加透徹的理解上述三種繼承方式的性質:
#include <iostream> #include <string>using namespace std;class Parent { protected:int m_a; protected:int m_b; public:int m_c;void set(int a, int b, int c){m_a = a;m_b = b;m_c = c;} };class Child_A : public Parent { public:void print(){cout << "m_a = " << m_a << endl;cout << "m_b = " << m_b << endl;cout << "m_c = " << m_c << endl;} };class Child_B : protected Parent { public:void print(){cout << "m_a = " << m_a << endl;cout << "m_b = " << m_b << endl;cout << "m_c = " << m_c << endl;} };class Child_C : private Parent { public:void print(){cout << "m_a = " << m_a << endl;cout << "m_b = " << m_b << endl;cout << "m_c = " << m_c << endl;} };int main() { Child_A a;Child_B b;Child_C c;a.m_c = 100;// b.m_c = 100; // Child_B 保護繼承自 Parent, 所以所有的 public 成員全部變成了 protected 成員, 因此外界無法訪問// c.m_c = 100; // Child_C 私有繼承自 Parent, 所以所有的成員全部變成了 private 成員, 因此外界無法訪問a.set(1, 1, 1);// b.set(2, 2, 2); // Child_B 保護繼承自 Parent, 所以所有的 public 成員全部變成了 protected 成員, 因此外界無法訪問// c.set(3, 3, 3); // Child_C 私有繼承自 Parent, 所以所有的成員全部變成了 private 成員, 因此外界無法訪問a.print();b.print();c.print();return 0; }上面程序注釋掉的部分是錯誤的部分,詳細解釋已經在上面代碼中。
三、總結
雖然今天學了繼承的不同的方式,但是遺憾的是:
- C++工程項目中,一般只用public繼承
- protected和private繼承的復雜性遠大于實用性。
- C++的派生語言只支持一種繼承方式(public繼承)
- 繼承方式直接影響父類成員在子類的中的訪問屬性
總結
以上是生活随笔為你收集整理的【C++深度剖析教程24】C++中不同的继承方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 寻找第K大的数字
- 下一篇: C++ STL的查找算法