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

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

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

public 方式繼承

基類成員對派生類的可見性對派生類來說,基類的公有成員和保護成員可見,基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態(tài);基類的私有成員不可見,基類的私有成員仍然是私有的,派生類不可訪問基類中的私有成員。

基類成員對派生類對象的可見性對派生類對象來說,基類的公有成員是可見的,其他成員是不可見的。

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

簡單來說,派生類能訪問基類的public, protected成員,繼承過來權限不變,派生類對象只能訪問基類public成員。

測試代碼如下:

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() {
  // 下面兩行編譯不過,B類內(nèi)無法訪問父類的私有成員
  // 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; // 編譯不過,子類對象無法訪問父類protected的成員
 // cout << b.m_data1 << endl; // 編譯不過,子類對象無法訪問父類private的成員
 return 0;
}

private 方式繼承

基類成員對其對象的可見性與一般類及其對象的可見性相同,公有成員可見,其他成員不可見

基類成員對派生類的可見性對派生類來說,基類的公有成員和保護成員是可見的,基類的公有成員和保護成員都作為派生類的私有成員,并且不能被這個派生類的子類所訪問;基類的私有成員是不可見的,派生類不可訪問基類中的私有成員。

基類成員對派生類對象的可見性對派生類對象來說,基類的所有成員都是不可見的。所以,在私有繼承時,基類的成員只能由直接派生類訪問,而無法再往下繼承。

簡單來說派生類可以訪問基類的public, protected成員,繼承過來之后變成自己私有的。 派生類的對象啥都不能訪問。

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() {
  // 下面兩行編譯不過,B類內(nèi)無法訪問父類的私有成員
  // 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; // // 編譯不過,子類對象無法訪問父類public的成員
 // cout << b.m_data2 << endl; // 編譯不過,子類對象無法訪問父類protected的成員
 // cout << b.m_data1 << endl; // 編譯不過,子類對象無法訪問父類private的成員
 return 0;
}

protected 方式繼承

基類成員對派生類的可見性對派生類來說,基類的公有成員和保護成員是可見的,基類的公有成員和保護成員都作為派生類的保護成員,并且不能被這個派生類的子類的對象所訪問,但可以被派生類的子類所訪問;基類的私有成員是不可見的,派生類不可訪問基類中的私有成員。

基類成員對派生類對象的可見性對派生類對象來說,基類的所有成員都是不可見的。

簡單來說: 派生類可以訪問基類的public, protected,繼承過來都變成了protected,派生類對象啥都不能訪問。

總結(jié)

對于這三種方式繼承的派生類來說: 都能訪問基類的public, protected 成員;

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

對于三種方式派生類的對象來說: 只有public的方式繼承后,派生來的對象只能訪問基類的public成員,protected和private方式繼承,派生類的對象都不可以訪問父類的成員。

例: 請考慮標記為A到J的語句在編譯時可能出現(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都錯誤,因為 m_nPrt 是父類的private變量,子類不能訪問。

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

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

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

G錯誤。cd2是保護繼承的,派生類對象不能訪問父類成員。

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

I錯誤。cd2是私有繼承的,派生類對象不能訪問父類成員。

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

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

相關文章

  • C語言攝氏度互相轉(zhuǎn)換華氏

    C語言攝氏度互相轉(zhuǎn)換華氏

    這篇文章主要介紹了C語言攝氏度互相轉(zhuǎn)換華氏,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • 詳解c++11新特性之模板的改進

    詳解c++11新特性之模板的改進

    這篇文章主要介紹了詳解c++11新特性之模板的改進,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • C語言入門學習之fgets()函數(shù)和fputs()函數(shù)

    C語言入門學習之fgets()函數(shù)和fputs()函數(shù)

    fgetc() 和 fputc() 函數(shù)每次只能讀寫一個字符,速度較慢,實際開發(fā)中往往是每次讀寫一個字符串或者一個數(shù)據(jù)塊,這樣能明顯提高效率,這篇文章主要給大家介紹了關于C語言入門學習之fgets()函數(shù)和fputs()函數(shù)的相關資料,需要的朋友可以參考下
    2021-11-11
  • 12個關于C語言的有趣問答

    12個關于C語言的有趣問答

    這篇文章主要介紹了12個關于C語言的有趣問答,有助于讀者加深對C語言程序設計的理解,需要的朋友可以參考下
    2014-07-07
  • Unity編輯器下重啟的方法

    Unity編輯器下重啟的方法

    這篇文章主要介紹了Unity編輯器下重啟的方法的相關資料,希望通過本文能幫助到大家,讓大家學習理解這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • C++20中的std::span詳解

    C++20中的std::span詳解

    span就是一個連續(xù)對象存儲的觀察者,類似std::string_view是string的觀察者,這篇文章主要介紹了C++20?std::span,需要的朋友可以參考下
    2023-03-03
  • C語言?const修飾普通變量和指針的操作代碼

    C語言?const修飾普通變量和指針的操作代碼

    這篇文章主要介紹了C語言const修飾普通變量和指針,用const修飾普通變量時,是在語法層面限制了變量的修改,但是本質(zhì)上,變量還是變量,是一種不能被修改的變量,本文通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • Qt5升級到Qt6分步遷移教程小結(jié)

    Qt5升級到Qt6分步遷移教程小結(jié)

    Qt框架的一個新的長期支持版本6.5最近發(fā)布,本文主要介紹了Qt5升級到Qt6分步遷移教程小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • C++實現(xiàn)LeetCode(187.求重復的DNA序列)

    C++實現(xiàn)LeetCode(187.求重復的DNA序列)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(187.求重復的DNA序列),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++空指針void*的使用方法

    C++空指針void*的使用方法

    C++空指針void是一種通用指針類型,可以指向任何類型的數(shù)據(jù)或?qū)ο?。它不關心指向的數(shù)據(jù)或?qū)ο蟮念愋停魂P心指針本身的地址,在使用void指針時,需要將其轉(zhuǎn)換為特定類型的指針,以便對其進行操作或訪問其值,本文就給大家介紹一下C++空指針void的使用方法
    2023-06-06

最新評論