三种访问权限
我们知道C++中的类,有三种访问权限(也称作访问控制),它们分别是public、protected、private。要理解它们其实也很容易,看下面了一个例子。
父类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| 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(); cout << "姓名:" << m_name << endl; cout << "职称:" << m_title << endl; }
private: string m_title; };
|
调用方:
1 2 3 4 5 6 7
| void test() { Person person("张三", 22); person.ShowInfo(); cout << person.m_name << endl; cout << person.m_age << endl; }
|
总结:
我们对C++类三种方式控制权限总结如下,这与Java语言中的三种对应的访问权限是一样的。
访问权限 |
public |
protected |
private |
对本类 |
可见 |
可见 |
可见 |
对子类 |
可见 |
可见 |
不可见 |
对外部(调用方) |
可见 |
不可见 |
不可见 |
三种继承方式
C++中继承的方式还有多种,也分别都用public、protected、private表示。这与其他面向对象的语言就不一样,像Java只有继承的概念,默认是public继承的。
- 三种继承方式不影响子类对父类的访问权限,子类对父类只看父类的访问控制权。
如下面三种继承方式都能访问父类中的public和protected成员。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Teacher : private Person { public: Teacher(const string& name, int age, const string& title) : Person(name, age) , m_title(title) { }
void ShowTeacherInfo() { ShowInfo(); cout << "姓名:" << m_name << endl; cout << "职称:" << m_title << endl; }
private: string m_title; };
|
.
- 继承方式是为了控制子类(也称派生类)的调用方(也叫用户)对父类(也称基类)的访问权限。
public继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Teacher : public Person { public: Teacher(const string& name, int age, const string& title) : Person(name, age) , m_title(title) { }
void ShowTeacherInfo() { ShowInfo(); cout << "职称:" << m_title << endl; }
private: string m_title; };
void TestPublic() { Teacher teacher("李四", 35, "副教授"); teacher.ShowInfo(); cout << endl; teacher.ShowTeacherInfo(); }
|
结果:
1 2 3 4 5 6
| >姓名:李四 年龄:35
>姓名:李四 年龄:35 职称:副教授
|
private继承:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Teacher : private Person { public: Teacher(const string& name, int age, const string& title) : Person(name, age) , m_title(title) { }
void ShowTeacherInfo() { ShowInfo(); cout << "职称:" << m_title << endl; }
private: string m_title; };
void TestPrivate() { Teacher teacher("李四", 35, "副教授"); cout << endl; teacher.ShowTeacherInfo(); }
|
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 18 19 20 21 22 23 24 25 26 27
| class Teacher : protected Person { public: Teacher(const string& name, int age, const string& title) : Person(name, age) , m_title(title) { }
void ShowTeacherInfo() { ShowInfo(); cout << "职称:" << m_title << endl; }
private: string m_title; };
void TestProtected() { Teacher teacher("李四", 35, "副教授"); cout << endl; teacher.ShowTeacherInfo(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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(); ShowTeacherInfo(); cout << m_position << endl; }
private: string m_position; };
|