派生类的继承方式【C++继承】
- 類別
- public
- protected
- private
- 派生類成員標識
- 圖示(表格/圖)
- 分類(四類訪問)
- 類的作用域運算
- Shadow
- 作用域運算符::
- 小結
- why public?
- 繼承方式
- 繼承測試
- 結論
- 案例public QMainWindow
類別
public
公有繼承時,基類的公有成員和保護成員的訪問屬性在派生類中不變,而基類的私有成員在派生類中不可訪問。
即基類的公有成員和保護成員被繼承到派生類中仍作為派生類的公有成員和保護成員。派生類的其他成員可以直接訪問它們。
無論派生類的成員還是派生類的對象都無法訪問基類的私有成員。
protected
保護繼承時,基類的公有成員和保護成員都以保護成員的身份出現在派生類中,而基類的私有成員在派生類中不可訪問。
派生類的其他成員可以直接訪問從基類繼承來的公有和保護成員,但是類外部通過派生類的對象無法訪問它們。
無論派生類的成員還是派生類的對象,都無法訪問基類的私有成員。
private
私有繼承時,基類的公有成員和保護成員都以私有成員身份出現在派生類中,而基類的私有成員在派生類中不可訪問。
派生類的其他成員可以直接訪問它們,但是在類外部通過派生類的對象無法訪問。
無論是派生類的成員還是通過派生類的對象,都無法訪問從基類繼承的私有成員。
通過多次私有繼承后,對于基類的成員都會成為不可訪問。因此私有繼承比較少用。
派生類成員標識
圖示(表格/圖)
分類(四類訪問)
公有成員;保護成員;私有成員;不可訪問的成員;
#include <iostream>using namespace std;class Base { public:int pub; protected:int pro; private:int pri; };class Drive :public Base { public:void func(){pub = 10; //成功 public成員,子類中權限為publicpro = 100; //成功 protected成員,子類中權限為protectedpri = 1000; //報錯,private,子類不可見。} };int main() {Base b; b.pub = 10; //成功 public類外訪問b.pro = 100; //報錯,protected 類外不可訪問。b.pri = 1000; //報錯,繼承后private子類不可見。return 0; }編譯器報錯:
類的作用域運算
Shadow
如果某派生類的多個基類擁有同名的函數成員或者數據成員,同時派生類又新增這樣的同名成員,在這種情況下,派生類成員將 shadow(隱藏)所有基類的同名成員。這時就需要基類名+作用域運算符的方式才能調用基類的同名成員。
作用域運算符::
代碼演示:
#include <iostream> using namespace std; class Base { public:void func(){cout << "Base func()" << endl;} };class Drive :public Base { public:void func(){Base::func(); //被 shadow 的成員,可以這樣訪問cout << "Drive func()" << endl;} };int main() {Drive d;d.func(); // 訪問派生類成員d.Base::func(); //訪問基類成員return 0; }運行結果:
小結
Shadow在父子類中出現了同名的標識符(函數成員,數據成員),就會構成shadow現象。
如果想要訪問被shadow的成員,加上父類的命名空間。
Shadow的條件只有一個就是重名(重名函數成員或重名數據成員)。
why public?
所有繼承必須是 public,如果想私有繼承的話,應該采用將基類實例作為成員的方式作為替代。(引自 Google C++ 編程規范)。
繼承方式
繼承測試
#include <iostream> using namespace std;class Base { public:int pub; protected:int pro; private:int pri; };class Drive :public Base { public: };
public:傳承接口,傳承數據,保護隱私。
如果多級派生當中,均采用 public,直到最后一級,派生類中均可訪問基類的public,protected 成員。
protected:封殺接口,傳承數據,保護隱私。
如果多級派生當中,均采用 protected,直到最后一級,派生類對基類的所有成員即使可見,也均不可被類外調用。
private:封殺接口,封殺數據,保護隱私。
如果多級派生當中,均采用 private,直到最后一級,派生類中對基類的所有成員均變為不可見。
上面表格中給出不用傳遞到最后一級,直接下一級派生類中基類的所有成員就已經變為不可見。
結論
綜上所述,記住 public 繼承足矣。
案例public QMainWindow
使用第三類方庫,比如 QT,往往遵循這樣一個原則:先繼承,后添加新元素。體現子類的個性需求。
繼承–>組合–>使用。
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> class MainWindow : public / protected / private QMainWindow { Q_OBJECT public: MainWindow(QWidget * parent = 0); ~MainWindow(); };class MyWindow : private MainWindow { public:MyWindow(QWidget* parent = 0){this->setGeometry(1, 1, 1, 1);} }; #endif // MAINWINDOW_HQMainWindow 是 QT 框架中的一個窗口 widget,通常情況下會對其采用先繼承的方式,然后再添加成員的組合方式來使用。
如果不采用 public 繼承,后繼工作將無法開展。
總結
以上是生活随笔為你收集整理的派生类的继承方式【C++继承】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 派生类的友元与析构【C++继承】
- 下一篇: C++Primer Plus (第六版)