最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C++ 中的三種繼承方式

 更新時(shí)間:2021年03月03日 08:59:01   作者:程序員楊小哥  
這篇文章主要介紹了詳解C++ 中的三種繼承方式,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下

public 方式繼承

基類成員對(duì)派生類的可見(jiàn)性對(duì)派生類來(lái)說(shuō),基類的公有成員和保護(hù)成員可見(jiàn),基類的公有成員和保護(hù)成員作為派生類的成員時(shí),它們都保持原有的狀態(tài);基類的私有成員不可見(jiàn),基類的私有成員仍然是私有的,派生類不可訪問(wèn)基類中的私有成員。

基類成員對(duì)派生類對(duì)象的可見(jiàn)性對(duì)派生類對(duì)象來(lái)說(shuō),基類的公有成員是可見(jiàn)的,其他成員是不可見(jiàn)的。

所以,在公有繼承時(shí),派生類的對(duì)象可以訪問(wèn)基類中的公有成員,派生類的成員函數(shù)可以訪問(wèn)基類中的公有成員和保護(hù)成員。

簡(jiǎn)單來(lái)說(shuō),派生類能訪問(wèn)基類的public, protected成員,繼承過(guò)來(lái)權(quán)限不變,派生類對(duì)象只能訪問(wèn)基類public成員。

測(cè)試代碼如下:

class A
{
private:
 int m_data1;
 void print1() { cout << "private print1" << endl; }
protected:
 int m_data2;
 void print2() { cout << "protected print2" << endl; }
public:
 A(int x = 1, int y = 2, int z = 3) : m_data1(x), m_data2(y), m_data3(z) {}
 int m_data3;
 void print3() { cout << "protected print3" << endl; }
};

class B : public A
{
public:
 void test_public() {
  cout << m_data3 << endl;
  print3();
 }
 void test_protected() {
  cout << m_data2 << endl;
  print2();
 }
 void test_private() {
  // 下面兩行編譯不過(guò),B類內(nèi)無(wú)法訪問(wèn)父類的私有成員
  // cout << m_data1 << endl; 
  // print1();
 }
};


int main(int argc, char const* argv[])
{
 B b;
 b.test_public();
 b.test_protected();
 b.test_private();
 cout << b.m_data3 << endl;
 // cout << b.m_data2 << endl; // 編譯不過(guò),子類對(duì)象無(wú)法訪問(wèn)父類protected的成員
 // cout << b.m_data1 << endl; // 編譯不過(guò),子類對(duì)象無(wú)法訪問(wèn)父類private的成員
 return 0;
}

private 方式繼承

基類成員對(duì)其對(duì)象的可見(jiàn)性與一般類及其對(duì)象的可見(jiàn)性相同,公有成員可見(jiàn),其他成員不可見(jiàn)

基類成員對(duì)派生類的可見(jiàn)性對(duì)派生類來(lái)說(shuō),基類的公有成員和保護(hù)成員是可見(jiàn)的,基類的公有成員和保護(hù)成員都作為派生類的私有成員,并且不能被這個(gè)派生類的子類所訪問(wèn);基類的私有成員是不可見(jiàn)的,派生類不可訪問(wèn)基類中的私有成員。

基類成員對(duì)派生類對(duì)象的可見(jiàn)性對(duì)派生類對(duì)象來(lái)說(shuō),基類的所有成員都是不可見(jiàn)的。所以,在私有繼承時(shí),基類的成員只能由直接派生類訪問(wèn),而無(wú)法再往下繼承。

簡(jiǎn)單來(lái)說(shuō)派生類可以訪問(wèn)基類的public, protected成員,繼承過(guò)來(lái)之后變成自己私有的。 派生類的對(duì)象啥都不能訪問(wèn)。

class A
{
private:
 int m_data1;
 void print1() { cout << "private print1" << endl; }
protected:
 int m_data2;
 void print2() { cout << "protected print2" << endl; }
public:
 A(int x = 1, int y = 2, int z = 3) : m_data1(x), m_data2(y), m_data3(z) {}
 int m_data3;
 void print3() { cout << "protected print3" << endl; }
};

class B : private A
{
public:
 void test_public() {
  cout << m_data3 << endl;
  print3();
 }
 void test_protected() {
  cout << m_data2 << endl;
  print2();
 }
 void test_private() {
  // 下面兩行編譯不過(guò),B類內(nèi)無(wú)法訪問(wèn)父類的私有成員
  // cout << m_data1 << endl; 
  // print1();
 }
};


int main(int argc, char const* argv[])
{
 B b;
 b.test_public();
 b.test_protected();
 b.test_private();
 // cout << b.m_data3 << endl; // // 編譯不過(guò),子類對(duì)象無(wú)法訪問(wèn)父類public的成員
 // cout << b.m_data2 << endl; // 編譯不過(guò),子類對(duì)象無(wú)法訪問(wèn)父類protected的成員
 // cout << b.m_data1 << endl; // 編譯不過(guò),子類對(duì)象無(wú)法訪問(wèn)父類private的成員
 return 0;
}

protected 方式繼承

基類成員對(duì)派生類的可見(jiàn)性對(duì)派生類來(lái)說(shuō),基類的公有成員和保護(hù)成員是可見(jiàn)的,基類的公有成員和保護(hù)成員都作為派生類的保護(hù)成員,并且不能被這個(gè)派生類的子類的對(duì)象所訪問(wèn),但可以被派生類的子類所訪問(wèn);基類的私有成員是不可見(jiàn)的,派生類不可訪問(wèn)基類中的私有成員。

基類成員對(duì)派生類對(duì)象的可見(jiàn)性對(duì)派生類對(duì)象來(lái)說(shuō),基類的所有成員都是不可見(jiàn)的。

簡(jiǎn)單來(lái)說(shuō): 派生類可以訪問(wèn)基類的public, protected,繼承過(guò)來(lái)都變成了protected,派生類對(duì)象啥都不能訪問(wèn)。

總結(jié)

對(duì)于這三種方式繼承的派生類來(lái)說(shuō): 都能訪問(wèn)基類的public, protected 成員;

  • public 的方式繼承到派生類,這些成員的權(quán)限和在基類里的權(quán)限保持一致;
  • protected方式繼承到派生類,成員的權(quán)限都變?yōu)閜rotected;
  • private 方式繼承到派生類,成員的權(quán)限都變?yōu)閜rivate;

對(duì)于三種方式派生類的對(duì)象來(lái)說(shuō): 只有public的方式繼承后,派生來(lái)的對(duì)象只能訪問(wèn)基類的public成員,protected和private方式繼承,派生類的對(duì)象都不可以訪問(wèn)父類的成員。

例: 請(qǐng)考慮標(biāo)記為A到J的語(yǔ)句在編譯時(shí)可能出現(xiàn)的情況。

#include<iostream>
#include<cstdio>

class Parent
{
public:
 Parent(int var=-1) {
  m_nPub = var;
  m_nPtd = var;
  m_bPrt = var;
 }
 int m_nPub;
protected:
 int m_nPtd;
private:
 int m_nPrt;
};

class Child1 : public Parent
{
public:
 int GetPub() { return m_nPub; }
 int GetPtd() { return m_nPtd; }
 int GetPrt() { return m_nPrt; }
 // A
};

class Child2 : protected Parent
{
public:
 int GetPub() { return m_nPub; }
 int GetPtd() { return m_nPtd; }
 int GetPrt() { return m_nPrt; }
 // B
};

class Child3 : private Parent
{
public:
 int GetPub() { return m_nPub; }
 int GetPtd() { return m_nPtd; }
 int GetPrt() { return m_nPrt; }
 // C
};

int main(int argc, char const *argv[])
{
 Child1 cd1;
 Child2 cd2;
 Child3 cd3;

 int nVar = 0;

 // public inherited
 cd1.m_nPub = nVar; // D
 cd1.m_nPtd = nVar; // E
 nVar = cd1.GetPtd(); // F

 // protected inherited
 cd2.m_nPub = nVar; // G
 nVar = cd2.GetPtd(); // H

 // private inherited
 cd3.m_nPub = nVar; // I
 nVar = cd3.GetPtd(); // J
 return 0;
}

A, B, C都錯(cuò)誤,因?yàn)?m_nPrt 是父類的private變量,子類不能訪問(wèn)。

D正確。 cdl是公有繼承,可以訪問(wèn)并改變父類的公有變量。

E 錯(cuò)誤。 m_nPtd 是父類 Parent 的保護(hù)變量,不可以被公有繼承的 cdl 訪問(wèn), 更不可以被修改。 雖然 m_nPtd 是父類 Parent 的保護(hù)變量,經(jīng)過(guò)公有繼承后, m_nPtd 在子類中依然是protected, 而子類的對(duì)象cdl是不能訪問(wèn)自身的protected成員,只能訪問(wèn)public成員。

F正確。派生類內(nèi)可以訪問(wèn)父類的保護(hù)變量。

G錯(cuò)誤。cd2是保護(hù)繼承的,派生類對(duì)象不能訪問(wèn)父類成員。

H正確。派生類內(nèi)可以訪問(wèn)父類的保護(hù)變量。

I錯(cuò)誤。cd2是私有繼承的,派生類對(duì)象不能訪問(wèn)父類成員。

J正確。派生類內(nèi)可以訪問(wèn)父類的保護(hù)變量。

以上就是詳解C++ 中的三種繼承方式的詳細(xì)內(nèi)容,更多關(guān)于c++ 繼承方式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c++ 結(jié)構(gòu)體內(nèi)存對(duì)齊基本概念及示例

    c++ 結(jié)構(gòu)體內(nèi)存對(duì)齊基本概念及示例

    這篇文章主要介紹了c++ 結(jié)構(gòu)體內(nèi)存對(duì)齊基本概念及示例,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-12-12
  • C語(yǔ)言編寫(xiě)掃雷小程序

    C語(yǔ)言編寫(xiě)掃雷小程序

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言編寫(xiě)掃雷小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • C++中string使用+號(hào)與int拼接方式

    C++中string使用+號(hào)與int拼接方式

    這篇文章主要介紹了C++中string使用+號(hào)與int拼接方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++ 異常的詳細(xì)介紹

    C++ 異常的詳細(xì)介紹

    這篇文章主要介紹了C++ 異常的詳細(xì)介紹的相關(guān)資料,希望通過(guò)本文大家能夠掌握C++異常的使用方法,需要的朋友可以參考下
    2017-09-09
  • 一元多項(xiàng)式加法運(yùn)算

    一元多項(xiàng)式加法運(yùn)算

    今天小編就為大家分享一篇關(guān)于一元多項(xiàng)式加法運(yùn)算,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • C語(yǔ)言實(shí)現(xiàn)通訊錄的示例代碼

    C語(yǔ)言實(shí)現(xiàn)通訊錄的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何錄音C語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-10-10
  • VC下通過(guò)系統(tǒng)快照實(shí)現(xiàn)進(jìn)程管理的方法

    VC下通過(guò)系統(tǒng)快照實(shí)現(xiàn)進(jìn)程管理的方法

    這篇文章主要介紹了VC下通過(guò)系統(tǒng)快照實(shí)現(xiàn)進(jìn)程管理的方法,較為詳細(xì)的講述了VC下通過(guò)系統(tǒng)快照實(shí)現(xiàn)進(jìn)程管理的原理與具體實(shí)現(xiàn)方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C++數(shù)據(jù)結(jié)構(gòu)之單鏈表

    C++數(shù)據(jù)結(jié)構(gòu)之單鏈表

    這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之單鏈表,鏈表是由一個(gè)個(gè)結(jié)點(diǎn)鏈結(jié)成的。結(jié)點(diǎn)包括數(shù)據(jù)域和指針域兩部分,數(shù)據(jù)域用來(lái)存儲(chǔ)數(shù)據(jù)元素的信息,指針域用來(lái)存儲(chǔ)下一個(gè)結(jié)點(diǎn)的地址,更詳細(xì)內(nèi)容請(qǐng)需要的小伙伴參考下面文章內(nèi)容
    2022-01-01
  • C++深入分析內(nèi)聯(lián)函數(shù)的使用

    C++深入分析內(nèi)聯(lián)函數(shù)的使用

    為了消除函數(shù)調(diào)用的時(shí)空開(kāi)銷(xiāo),C++ 提供一種提高效率的方法,即在編譯時(shí)將函數(shù)調(diào)用處用函數(shù)體替換,類似于C語(yǔ)言中的宏展開(kāi)。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱為內(nèi)聯(lián)函數(shù)(Inline Function),又稱內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)
    2022-04-04
  • C++實(shí)現(xiàn)LeetCode(40.組合之和之二)

    C++實(shí)現(xiàn)LeetCode(40.組合之和之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(40.組合之和之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

高邮市| 三江| 鄂伦春自治旗| 嘉峪关市| 晋江市| 永福县| 榆树市| 高阳县| 沙洋县| 大足县| 伽师县| 凉城县| 巧家县| 垫江县| 大田县| 山阳县| 水富县| 高邑县| 陵水| 宁蒗| 西藏| 江都市| 马龙县| 沧州市| 棋牌| 隆德县| 姚安县| 禹城市| 晋中市| 寻乌县| 银川市| 天长市| 刚察县| 民勤县| 宁德市| 佛学| 容城县| 苏州市| 霍邱县| 靖安县| 瑞昌市|