欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C/C++ 公有繼承、保護(hù)繼承和私有繼承的對(duì)比詳解

 更新時(shí)間:2017年02月14日 09:03:33   投稿:lqh  
這篇文章主要介紹了C/C++ 公有繼承、保護(hù)繼承和私有繼承的區(qū)別的相關(guān)資料,需要的朋友可以參考下

C/C++ 公有繼承、保護(hù)繼承和私有繼承的區(qū)別

   在c++的繼承控制中,有三種不同的控制權(quán)限,分別是public、protected和private。定義派生類時(shí),若不顯示加上這三個(gè)關(guān)鍵字,就會(huì)使用默認(rèn)的方式,用struct定義的類是默認(rèn)public繼承,class定義的類是默認(rèn)private繼承。這和Java有很大的不同,Java默認(rèn)使用public繼承,而且只有公有繼承。

        1.使用public繼承時(shí),派生類內(nèi)部可以訪問(wèn)基類中public和protected成員,但是類外只能通過(guò)派生類的對(duì)象訪問(wèn)基類的public成員。

        (1)基類的public成員在派生類中依然是public的。

        (2)基類中的protected成員在派生類中依然是protected的。

        (3)基類中的private成員在派生類中不可訪問(wèn)。

        2.使用protected繼承時(shí),派生類內(nèi)部可以訪問(wèn)基類中public和protected成員,并且類外也不能通過(guò)派生類的對(duì)象訪問(wèn)基類的成員(可以在派生類中添加公有成員函數(shù)接口間接訪問(wèn)基類中的public和protected成員)。

        (1)基類的public成員在派生類中變?yōu)閜rotected成員。

        (2)基類的protected成員在派生類中依然是protected成員。

        (3)基類中的private成員在派生類中不可訪問(wèn)。

       3.使用private繼承時(shí),派生類內(nèi)部可以訪問(wèn)基類中public和protected成員,并且類外也不能通過(guò)派生類的對(duì)象訪問(wèn)基類的成員(可以在派生類中添加公有成員函數(shù)接口間接訪問(wèn)基類中的public和protected成員)。

        (1)基類的public成員在派生類中變成private成員。

        (2)基類的protected成員在派生類中變成private成員。

        (3)基類的private成員在派生類中不可訪問(wèn)。

        為了便于理解,我們用一個(gè)表格來(lái)說(shuō)明這幾種控制符使用的情況:  

派 生 方 式  基類的public成員 基類的protected成員 基類的private成員
public派生 還是public成員 變?yōu)閜rotected成員 不可見(jiàn)
protected派生 變成protected成員    還是protected成員 不可見(jiàn)
private派生 變?yōu)閜rivate成員 變成private成員 不可見(jiàn)

       下面用代碼簡(jiǎn)單敘述

#include <iostream> 

class Base { 
public: 
  int public_a; 
  virtual void test() = 0; 

protected: 
  int protected_a; 

private: 
  int private_a; 
}; 

//公有繼承 
class PublicDerived : public Base { 
public: 
  virtual void test() { 
    public_a = 1;          //public_a public繼承后還是public類型 
    protected_a = 2;        //protected_a 還是protected類型 
    //private_a = 3;         //派生類不可訪問(wèn)基類私有成員 
  } 
}; 

//保護(hù)繼承 
class ProtectedDerived : protected Base { 
public: 
  virtual void test() { 
    public_a = 1;          //public_a protected繼承后變?yōu)閜rotected類型 
    protected_a = 2;        //protected_a 還是protected類型 
    //private_a = 3;        //派生類不可訪問(wèn)基類私有成員 
  } 
}; 

//私有繼承 
class PrivateDerived : private Base { 
public: 
  virtual void test() { 
    public_a = 1;          //public_a private繼承后變?yōu)閜rivate類型 
    protected_a = 2;        //protected_a private繼承后變?yōu)閜rivate類型 
    //private_a = 3;        //派生類不可訪問(wèn)基類私有成員 
  } 
}; 

        在c++中public繼承是is-a的關(guān)系。也就說(shuō)適用于基類身上的一定也適用于派生類身上,因?yàn)槊恳粋€(gè)派生類對(duì)象也都是一個(gè)基類對(duì)象。派生類對(duì)象轉(zhuǎn)換為基類對(duì)象在需要的時(shí)候是可以自動(dòng)轉(zhuǎn)化的。

        其實(shí),protected和private派生后的派生類不是基類的子類,因?yàn)榇伺缮惒荒茏龌愃茏龅乃惺虑?。我們看看下面的代碼

#include <iostream> 

class Person { 
public: 
  Person(){}; 

  void eat() {std::cout << "eat\n";} 
}; 

//公有繼承 
class PublicStudent : public Person { 
public: 
  PublicStudent() {} 

  void study() {std::cout << "study\n";} 
}; 

//保護(hù)繼承 
class ProtectedStudent : protected Person { 
public: 
  ProtectedStudent() {} 

  void study() {std::cout << "study\n";} 
}; 

//私有繼承 
class PrivateStudent : private Person { 
public: 
  PrivateStudent() {} 

  void study() {std::cout << "study\n";} 
}; 

 

void func_test(Person &p) { 
  p.eat(); 
} 

int main() { 

  PublicStudent public_s; 
  ProtectedStudent protected_s; 
  PrivateStudent private_s; 

  func_test(public_s);          //正確,公有繼承時(shí),派生類可以做基類的所有事情 
  func_test(protected_s);         //出錯(cuò),保護(hù)繼承時(shí),派生類不能做基類的所有事情 
  func_test(private_s);          //出錯(cuò),私有繼承時(shí),派生類不可以做基類的所有事情 

  system("pause"); 

  return 0; 
} 

        func_test()需要一個(gè)Person類型的對(duì)象,在調(diào)用func_test(public_s)時(shí)實(shí)際傳遞的是PublicStudent對(duì)象,因?yàn)镻ublicStudent共有繼承Person類,所以PublicStudent對(duì)象可以使用Person類中所有的公有成員,也就是說(shuō)基類對(duì)象可以做的事,公有繼承的派生類對(duì)象照樣可以做。而ProtectedStudent和PrivateStudent都是非公有有繼承,他們的對(duì)象不可以直接訪問(wèn)Person類的成員。但是在他們派生類的對(duì)象空間中是包含基類的的對(duì)象,只是無(wú)法讓他們公開(kāi)訪問(wèn)。從上面的代碼可以看出來(lái),protected繼承和private繼承的派生類已經(jīng)不是基類的子類了。

       寫了這么多,其實(shí)非公有繼承很少遇到。

 感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • C/C++內(nèi)存泄漏原因分析與應(yīng)對(duì)方法

    C/C++內(nèi)存泄漏原因分析與應(yīng)對(duì)方法

    內(nèi)存泄漏會(huì)導(dǎo)致當(dāng)前應(yīng)用程序消耗更多的內(nèi)存,使得其他應(yīng)用程序可用的內(nèi)存更少了,那么為什么會(huì)內(nèi)存泄漏,我們應(yīng)該怎樣應(yīng)對(duì)內(nèi)存泄漏,所以接下來(lái)就給大家詳細(xì)介紹一下C++內(nèi)存泄漏原因分析與應(yīng)對(duì)方法,需要的朋友可以參考下
    2023-07-07
  • 簡(jiǎn)單介紹C++編程中派生類的析構(gòu)函數(shù)

    簡(jiǎn)單介紹C++編程中派生類的析構(gòu)函數(shù)

    這篇文章主要介紹了C++編程中派生類的析構(gòu)函數(shù),析構(gòu)函數(shù)平時(shí)一般使用較少,需要的朋友可以參考下
    2015-09-09
  • C語(yǔ)言系統(tǒng)日期和時(shí)間實(shí)例詳解

    C語(yǔ)言系統(tǒng)日期和時(shí)間實(shí)例詳解

    我們?cè)趯慍語(yǔ)言程序的時(shí)候,有的時(shí)候會(huì)用到讀取本機(jī)的時(shí)間和日期,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言系統(tǒng)日期和時(shí)間的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Qt QChart實(shí)現(xiàn)折線圖的繪制

    Qt QChart實(shí)現(xiàn)折線圖的繪制

    QChart是常用的圖表,這篇文章主要為大家詳細(xì)介紹了Qt如何利用QChart實(shí)現(xiàn)折線圖的繪制,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-04-04
  • 非常經(jīng)典的C語(yǔ)言趣味題目

    非常經(jīng)典的C語(yǔ)言趣味題目

    在這個(gè)網(wǎng)站上發(fā)現(xiàn)一套很有趣的C語(yǔ)言測(cè)試題,如果你招聘C語(yǔ)言相關(guān)開(kāi)發(fā)人員,或者正在學(xué)習(xí)C語(yǔ)言,很值得做一做
    2013-04-04
  • C++序列操作函數(shù)學(xué)習(xí)最全指南

    C++序列操作函數(shù)學(xué)習(xí)最全指南

    這篇文章主要給大家介紹了關(guān)于C++序列操作函數(shù)學(xué)習(xí)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • C++實(shí)現(xiàn)LeetCode(107.二叉樹(shù)層序遍歷之二)

    C++實(shí)現(xiàn)LeetCode(107.二叉樹(shù)層序遍歷之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(107.二叉樹(shù)層序遍歷之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • c語(yǔ)言實(shí)現(xiàn)足球比賽積分統(tǒng)計(jì)系統(tǒng)

    c語(yǔ)言實(shí)現(xiàn)足球比賽積分統(tǒng)計(jì)系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了c語(yǔ)言實(shí)現(xiàn)足球比賽積分統(tǒng)計(jì)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 詳解C語(yǔ)言中const關(guān)鍵字的用法

    詳解C語(yǔ)言中const關(guān)鍵字的用法

    這篇文章主要對(duì)C語(yǔ)言中const關(guān)鍵字的用法進(jìn)行了詳細(xì)的分析介紹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-08-08
  • C++ Qt開(kāi)發(fā)之使用QProcess實(shí)現(xiàn)進(jìn)程管理

    C++ Qt開(kāi)發(fā)之使用QProcess實(shí)現(xiàn)進(jìn)程管理

    Qt 是一個(gè)跨平臺(tái)C++圖形界面開(kāi)發(fā)庫(kù),利用Qt可以快速開(kāi)發(fā)跨平臺(tái)窗體應(yīng)用程序,本文將重點(diǎn)介紹如何運(yùn)用QProcess組件實(shí)現(xiàn)針對(duì)進(jìn)程的控制管理等,感興趣的可以了解下
    2024-03-03

最新評(píng)論