三種訪問許可權
我們知道C++中的類,有三種訪問許可權(也稱作訪問控制),它們分別是public、protected、private。要理解它們其實也很容易,看下面了一個例子。
父類:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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; //年齡 }; |
子類:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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; //職稱 }; |
呼叫方:
1 2 3 4 5 6 7 |
void test() { Person person("張三", 22); person.ShowInfo(); //public屬性,對外部可見 cout << person.m_name << endl; //protected屬性,對外部不可見 cout << person.m_age << endl; //private屬性,對外部不可見 } |
總結
我們對C++類三種方式控制許可權總結如下,這與Java中的三種對應的訪問許可權是一樣的。
三種繼承方式
C++中繼承的方式還有多種,也分別都用public、protected、private表示。這與Java不一樣,Java只有繼承的概念,預設是public繼承的。
1. 三種繼承方式不影響子類對父類的訪問許可權,子類對父類只看父類的訪問控制權。
如下面三種繼承方式都能訪問父類中的public和protected成員。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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繼承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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; //職稱 }; |
1 2 3 4 5 6 7 |
void TestPublic() { Teacher teacher("李四", 35, "副教授"); teacher.ShowInfo(); cout << endl; teacher.ShowTeacherInfo(); } |
結果:
姓名:李四
年齡:35姓名:李四
年齡:35
職稱:副教授
private繼承:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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; //職稱 }; |
1 2 3 4 5 6 7 |
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繼承:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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; //職稱 }; |
1 2 3 4 5 6 7 |
void TestProtected() { Teacher teacher("李四", 35, "副教授"); teacher.ShowInfo(); //錯誤,基類Person的ShowInfo此時對Teacher相當於protected的,外部不可以被訪問 cout << endl; teacher.ShowTeacherInfo(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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; }; |