1. 程式人生 > >C++的三種訪問許可權與三種繼承方式

C++的三種訪問許可權與三種繼承方式

三種訪問許可權

我們知道C++中的類,有三種訪問許可權(也稱作訪問控制),它們分別是public、protected、private。要理解它們其實也很容易,看下面了一個例子。
父類:

class Person
{
public:
    Person(const string& name, int age) : m_name(name), m_age(age)
    {
    }

    void ShowInfo()
    {
        cout << "姓名:" << m_name << endl;
        cout << "年齡:"
<< m_age << endl; } protected: string m_name; //姓名 private: int m_age; //年齡 };

子類:

class Teacher : public Person
{
public:
    Teacher(const string& name, int age, const string& title)
        : Person(name, age), m_title(title)
    {
    }

    void ShowTeacherInfo()
    {
        ShowInfo();                             //正確,public屬性子類可見
cout << "姓名:" << m_name << endl; //正確,protected屬性子類可見 cout << "年齡:" << m_age << endl; //錯誤,private屬性子類不可見 cout << "職稱:" << m_title << endl; //正確,本類中可見自己的所有成員 } private: string m_title; //職稱 };

呼叫方:

void test()
{
    Person person("張三", 22);
    person.ShowInfo();                  //public屬性,對外部可見
    cout << person.m_name << endl;      //protected屬性,對外部不可見
    cout << person.m_age << endl;       //private屬性,對外部不可見
}

總結

我們對C++類三種方式控制權限總結如下,這與Java中的三種對應的訪問許可權是一樣的。

訪問許可權 public protected private
對本類 可見 可見 可見
對子類 可見 可見 不可見
對外部(呼叫方) 可見 不可見 不可見

三種繼承方式

C++中繼承的方式還有多種,也分別都用public、protected、private表示。這與Java不一樣,Java只有繼承的概念,預設是public繼承的。
1. 三種繼承方式不影響子類對父類的訪問許可權,子類對父類只看父類的訪問控制權。如下面三種繼承方式都能訪問父類中的public和protected成員。

class Teacher : /*public*/ /*protected*/ private Person
{
public:
    Teacher(const string& name, int age, const string& title)
        : Person(name, age), m_title(title)
    {
    }

    void ShowTeacherInfo()
    {
        ShowInfo();                             //正確,public屬性子類可見
        cout << "姓名:" << m_name << endl;        //正確,protected屬性子類可見
        //cout << "年齡:" << m_age << endl;       //錯誤,private屬性子類不可見

        cout << "職稱:" << m_title << endl;   //正確,本類中可見自己的所有成員
    }

private:
    string  m_title;        //職稱
};

.
2. 繼承方式是為了控制子類(也稱派生類)的呼叫方(也叫使用者)對父類(也稱基類)的訪問許可權。

public繼承

class Teacher : public Person
{
public:
    Teacher(const string& name, int age, const string& title)
        : Person(name, age), m_title(title)
    {
    }

    void ShowTeacherInfo()
    {
        ShowInfo();                             //正確,public屬性子類可見
        cout << "職稱:" << m_title << endl;   //正確,本類中可見自己的所有成員
    }

private:
    string  m_title;        //職稱
};
void TestPublic()
{
    Teacher teacher("李四", 35, "副教授");
    teacher.ShowInfo();
    cout << endl;
    teacher.ShowTeacherInfo();
}

結果:

姓名:李四
年齡:35

姓名:李四
年齡:35
職稱:副教授

private繼承:

class Teacher : private Person
{
public:
    Teacher(const string& name, int age, const string& title)
        : Person(name, age), m_title(title)
    {
    }

    void ShowTeacherInfo()
    {
        ShowInfo();                             //正確,public屬性子類可見
        cout << "職稱:" << m_title << endl;   //正確,本類中可見自己的所有成員
    }

private:
    string  m_title;        //職稱
};
void TestPrivate()
{
    Teacher teacher("李四", 35, "副教授");
    teacher.ShowInfo();             //錯誤,因為Teacher採用了private的繼承方式,外部不可訪問。
    cout << endl;
    teacher.ShowTeacherInfo();
}

.
3. public、protected、private三種繼承方式,相當於把父類的public訪問許可權在子類中變成了對應的許可權。 如protected繼承,把父類中的public成員在本類中變成了protected的訪問控制權限;private繼承,把父類的public成員和protected成員在本類中變成了private訪問控制權。

protected繼承:

class Teacher : protected Person
{
public:
    Teacher(const string& name, int age, const string& title)
        : Person(name, age), m_title(title)
    {
    }

    void ShowTeacherInfo()
    {
        ShowInfo();                             //正確,public屬性子類可見
        cout << "職稱:" << m_title << endl;   //正確,本類中可見自己的所有成員
    }

private:
    string  m_title;        //職稱
};
void TestProtected()
{
    Teacher teacher("李四", 35, "副教授");
    teacher.ShowInfo();         //錯誤,基類Person的ShowInfo此時對Teacher相當於protected的,外部不可以被訪問
    cout << endl;
    teacher.ShowTeacherInfo();
}
class Leader : public Teacher
{
public:
    Leader(const string& name, int age, const string& title, string position)
        : Teacher(name, age, title), m_position(position)
    {
    }

    void ShowLeaderInfo()
    {
        ShowInfo();             //基類Person的ShowInfo此時相當於protected的,但子類仍可以訪問
        ShowTeacherInfo();      //ShowTeacherInfo仍然是public的,可以訪問
        cout << m_position << endl;
    }

private:
    string m_position;
};

相關推薦

C++的訪問許可權繼承方式

三種訪問許可權 我們知道C++中的類,有三種訪問許可權(也稱作訪問控制),它們分別是public、protected、private。要理解它們其實也很容易,看下面了一個例子。 父類: class Person { public: Person

繼承方式訪問許可權的相互組合

        對基類進行繼承時,三種繼承方式下,基類的三種訪問許可權在子類中會有如何的變化這個問題,本科時上C++這門課的時候曾仔細的分析並弄得挺清楚,後來時間久了、用的也不多,慢慢的又變得心裡不太有譜了。這次接著準備面試的契機,又重新仔細分析了一番,留個案底,以免再犯糊塗

C++繼承,訪問許可權

什麼是類:     <1>    兩個或多個類之間有父子關係,即把兩個類相同的程式碼寫到父類裡面,然後子類可以方便用。(個人理解)繼承用法:把幾個類相同的程式碼拿出來,封裝成一個父類,然後繼

Django:Error: [WinError 10013] 以一訪問許可權不允許的方式做了一個訪問套接字的嘗試。(殺佔用埠程序)

Error: [WinError 10013] 以一種訪問許可權不允許的方式做了一個訪問套接字的嘗試。 1.啟動伺服器的時候提示埠被佔用,Error: [WinError 10013] 以一種訪問許可權不允許的方式做了一個訪問套接字的嘗試。  解決方案 1.查找出被佔用的

JAVA學習筆記第一天---四訪問許可權修飾符

  public protected 空的(deault) private 同一類中 √ √ √ √ 同一包中(子類與無關類) √

java程式設計入門2 java中的四訪問許可權控制

在java中提供了四種訪問許可權控制:預設訪問許可權(包訪問許可權),public,private以及protected 只有預設訪問許可權(包訪問許可權)和public能用來修飾類(不包括內部類) 修飾變數和方法這四種許可權均可 1.public 修飾類表示該類對其他所有類可見 修飾一個類的變數和

_038_Android_Android 檔案訪問許可權的四模式

轉自https://www.cnblogs.com/wuyudong/p/5552833.html,感謝作者的無私分享。  Linux檔案的訪問許可權 * 在Android中,每一個應用是一個獨立的使用者 * drwxrwxrwx * 第1位:d表示資料夾,-表示檔案 * 第2-4位:

探究Java中的4訪問許可權--------Java的系列學習之路(14)

前言—— 今天軍訓的第四天,早上下了小雨,摸魚了一上午,下午練軍體拳。想寫的內容很多,突然不知道今晚總結什麼,最終決定寫個基本但是非常重要的部分。 歡迎轉載,轉載請註明來處。 在Java中有4種訪問許可權關鍵字,分別是public,private,protected,

Error: [WinError 10013] 以一訪問許可權不允許的方式做了一個訪問套接字的嘗試。

該錯誤其實是Django的埠號被佔用,解決步驟如下:1.找出佔用的埠號:輸入netstat -ano|findstr 8000  2.找出埠號對應的伺服器:tasklist if indstr 3144 i 3.終止埠號對應的程序:輸入taskkill /pid

2018年11月10日Java學習之類的特徵二:繼承extends,重寫override,private,default,protected,public四訪問許可權修飾符,super關鍵字

1.類的繼承extends,舉個例子 2.子類繼承了父類,就繼承了父類的方法和屬性。 在子類中,可以使用父類中定義的方法和屬性,也可以建立新的資料和方法。 3.子類不能直接訪問父類中私有的(private)的成員變數和方法。 4.Java只支援單繼承,不允許

java四訪問許可權歸納

一、Java中有四種訪問許可權, 其中三種有訪問許可權修飾符,分別為private、public、protected,還有一種不帶任何修飾符(default)。 private: Java語言中對訪問許可權限制的最窄的修飾符,一般稱之為“私有的”。被其修飾的屬性以及方法只能被該類的物件

java裡面的四訪問許可權修飾符(private、預設、protected、public)

                Java許可權修飾符public、protect、private置於類的成員定以前,用來限定物件對該類成員的訪問許可權(精闢準確);              修飾符                               類內部   

訪問許可權修飾符的區別

   訪問許可權修飾符    a、私有許可權(private)      private可以修飾資料成員,構造方法,方法成員,不能修飾類(此處指外部類,不考慮內部類)。被private修飾的成員,只能在定義它們的類中使用,在其他類中不能呼叫。      b、預設許可權(d

java之中的四訪問許可權和子類如何繼承父類特性

Public:對所有類可見 Protected:對同一包中的類,和子類可見 Private:僅對類本身可見         Default:對同一包中的類可見 為了理解方便,可見的意思也就是可以使用這個特性(域,方法,類),對子類可見就是子類也具有這些特性。但是繼承的時候,

OSError: [WinError 10013] 以一訪問許可權不允許的方式做了一個訪問套接字的嘗試

建立mock介面,執行時報錯。 通過命令檢視是否存在端口占用的問題。cmd下輸入 netstat -ano|findstr 8080,找出8080埠對應的PID程序為4228。 輸入tasklist |findstr 4228找出程序對應的詳細資訊。 解決辦

我的理解之JAVA中的4訪問許可權

一、Java中有四種訪問許可權,private、default(一般省略)、public、protected。 private: Java語言中對訪問許可權限制的最窄的修飾符,一般稱之為“私有的”。被其修飾的屬性以及方法只能被該類的物件訪問,其子類

Java中四訪問許可權總結

一、Java中有四種訪問許可權, 其中三種有訪問許可權修飾符,分別為private、public、protected,還有一種不帶任何修飾符(default)。 1. private: Java語言中對訪問許可權限制的最窄的修飾符,一般稱之為“私有的”。被其修飾的屬性以及

Error: [WinError 10013] 以一訪問權限不允許的方式做了一個訪問套接字的嘗試。

技術分享 其它 被占用 ima 訪問權限 wine task -1 端口 該錯誤其實是Django的端口號被占用,解決步驟如下:1.找出占用的端口號:輸入netstart _anoif indstr 8000 2.找出端口號對應的服務器:tasklist if ind

啟動django應用報錯 “Error: [WinError 10013] 以一訪問權限不允許的方式做了一個訪問套接字的嘗試。”

pan dst 方式 ask 網上 參考 nds post csharp 啟動django應用時報如下錯誤 “Error: [WinError 10013] 以一種訪問權限不允許的方式做了一個訪問套接字的嘗試。” 網上查了一下,是8000端口被其他程序占用了,殺掉占用的程

Django幺蛾子之Error: [WinError 10013] 以一訪問權限不允許的方式做了一個訪問套接字的嘗試。

error: 分享圖片 做了 代碼 嘗試 項目 django 修改端口 技術   一般情況下,我們啟動Django項目時默認設置的端口為8000,當你聽著酷狗音樂敲著代碼,啟動Django項目時忽然翻車了. 不要慌,那是酷狗搶先一步占用了8000端口,解決這個問題的