日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

派生类的继承方式【C++继承】

發布時間:2025/3/20 c/c++ 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 派生类的继承方式【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_H

QMainWindow 是 QT 框架中的一個窗口 widget,通常情況下會對其采用先繼承的方式,然后再添加成員的組合方式來使用。
如果不采用 public 繼承,后繼工作將無法開展。

總結

以上是生活随笔為你收集整理的派生类的继承方式【C++继承】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。