C++ 的三种访问权限与三种继承方式
三种访问权限
我们知道C++中的类,有三种访问权限(也称作访问控制),它们分别是public、protected、private。要理解它们其实也很容易,看下面了一个例子。
父类:
classPerson { public: Person(conststring&name,intage):m_name(name),m_age(age) { } voidShowInfo() { cout<<"姓名:"<<m_name<<endl; cout<<"年龄:"<<m_age<<endl; } protected: stringm_name;//姓名 private: intm_age;//年龄 }; classPerson { public: Person(conststring&name,intage):m_name(name),m_age(age) { } voidShowInfo() { cout<<"姓名:"<<m_name<<endl; cout<<"年龄:"<<m_age<<endl; } protected: stringm_name;//姓名 private: intm_age;//年龄 };
子类:
classTeacher:publicPerson { public: Teacher(conststring&name,intage,conststring&title) :Person(name,age),m_title(title) { } voidShowTeacherInfo() { ShowInfo();//正确,public属性子类可见 cout<<"姓名:"<<m_name<<endl;//正确,protected属性子类可见 cout<<"年龄:"<<m_age<<endl;//错误,private属性子类不可见 cout<<"职称:"<<m_title<<endl;//正确,本类中可见自己的所有成员 } private: stringm_title;//职称 }; classTeacher:publicPerson { public: Teacher(conststring&name,intage,conststring&title) :Person(name,age),m_title(title) { } voidShowTeacherInfo() { ShowInfo();//正确,public属性子类可见 cout<<"姓名:"<<m_name<<endl;//正确,protected属性子类可见 cout<<"年龄:"<<m_age<<endl;//错误,private属性子类不可见 cout<<"职称:"<<m_title<<endl;//正确,本类中可见自己的所有成员 } private: stringm_title;//职称 };
调用方法:
voidtest() { Personperson("张三",22); person.ShowInfo();//public属性,对外部可见 cout<<person.m_name<<endl;//protected属性,对外部不可见 cout<<person.m_age<<endl;//private属性,对外部不可见 } voidtest() { Personperson("张三",22); person.ShowInfo();//public属性,对外部可见 cout<<person.m_name<<endl;//protected属性,对外部不可见 cout<<person.m_age<<endl;//private属性,对外部不可见 }
总结
我们对C++类三种方式控制权限总结如下,这与Java中的三种对应的访问权限是一样的。
qq%e6%88%aa%e5%9b%be20161104113813
三种继承方式
C++中继承的方式还有多种,也分别都用public、protected、private表示。这与Java不一样,Java只有继承的概念,默认是public继承的。
1.三种继承方式不影响子类对父类的访问权限,子类对父类只看父类的访问控制权。
如下面三种继承方式都能访问父类中的public和protected成员。
classTeacher:/*public*//*protected*/privatePerson { public: Teacher(conststring&name,intage,conststring&title) :Person(name,age),m_title(title) { } voidShowTeacherInfo() { ShowInfo();//正确,public属性子类可见 cout<<"姓名:"<<m_name<<endl;//正确,protected属性子类可见 //cout<<"年龄:"<<m_age<<endl;//错误,private属性子类不可见 cout<<"职称:"<<m_title<<endl;//正确,本类中可见自己的所有成员 } private: stringm_title;//职称 }; classTeacher:/*public*//*protected*/privatePerson { public: Teacher(conststring&name,intage,conststring&title) :Person(name,age),m_title(title) { } voidShowTeacherInfo() { ShowInfo();//正确,public属性子类可见 cout<<"姓名:"<<m_name<<endl;//正确,protected属性子类可见 //cout<<"年龄:"<<m_age<<endl;//错误,private属性子类不可见 cout<<"职称:"<<m_title<<endl;//正确,本类中可见自己的所有成员 } private: stringm_title;//职称 };
2.继承方式是为了控制子类(也称派生类)的调用方(也叫用户)对父类(也称基类)的访问权限。
public继承
classTeacher:publicPerson { public: Teacher(conststring&name,intage,conststring&title) :Person(name,age),m_title(title) { } voidShowTeacherInfo() { ShowInfo();//正确,public属性子类可见 cout<<"职称:"<<m_title<<endl;//正确,本类中可见自己的所有成员 } private: stringm_title;//职称 }; classTeacher:publicPerson { public: Teacher(conststring&name,intage,conststring&title) :Person(name,age),m_title(title) { } voidShowTeacherInfo() { ShowInfo();//正确,public属性子类可见 cout<<"职称:"<<m_title<<endl;//正确,本类中可见自己的所有成员 } private: stringm_title;//职称 }; voidTestPublic() { Teacherteacher("李四",35,"副教授"); teacher.ShowInfo(); cout<<endl; teacher.ShowTeacherInfo(); } voidTestPublic() { Teacherteacher("李四",35,"副教授"); teacher.ShowInfo(); cout<<endl; teacher.ShowTeacherInfo(); }
结果:
姓名:李四
年龄:35
姓名:李四
年龄:35
职称:副教授
private继承:
classTeacher:privatePerson { public: Teacher(conststring&name,intage,conststring&title) :Person(name,age),m_title(title) { } voidShowTeacherInfo() { ShowInfo();//正确,public属性子类可见 cout<<"职称:"<<m_title<<endl;//正确,本类中可见自己的所有成员 } private: stringm_title;//职称 }; classTeacher:privatePerson { public: Teacher(conststring&name,intage,conststring&title) :Person(name,age),m_title(title) { } voidShowTeacherInfo() { ShowInfo();//正确,public属性子类可见 cout<<"职称:"<<m_title<<endl;//正确,本类中可见自己的所有成员 } private: stringm_title;//职称 }; voidTestPrivate() { Teacherteacher("李四",35,"副教授"); teacher.ShowInfo();//错误,因为Teacher采用了private的继承方式,外部不可访问。 cout<<endl; teacher.ShowTeacherInfo(); } voidTestPrivate() { Teacherteacher("李四",35,"副教授"); teacher.ShowInfo();//错误,因为Teacher采用了private的继承方式,外部不可访问。 cout<<endl; teacher.ShowTeacherInfo(); }
3.public、protected、private三种继承方式,相当于把父类的public访问权限在子类中变成了对应的权限。
如protected继承,把父类中的public成员在本类中变成了protected的访问控制权限;private继承,把父类的public成员和protected成员在本类中变成了private访问控制权。
protected继承:
classTeacher:protectedPerson { public: Teacher(conststring&name,intage,conststring&title) :Person(name,age),m_title(title) { } voidShowTeacherInfo() { ShowInfo();//正确,public属性子类可见 cout<<"职称:"<<m_title<<endl;//正确,本类中可见自己的所有成员 } private: stringm_title;//职称 }; classTeacher:protectedPerson { public: Teacher(conststring&name,intage,conststring&title) :Person(name,age),m_title(title) { } voidShowTeacherInfo() { ShowInfo();//正确,public属性子类可见 cout<<"职称:"<<m_title<<endl;//正确,本类中可见自己的所有成员 } private: stringm_title;//职称 }; voidTestProtected() { Teacherteacher("李四",35,"副教授"); teacher.ShowInfo();//错误,基类Person的ShowInfo此时对Teacher相当于protected的,外部不可以被访问 cout<<endl; teacher.ShowTeacherInfo(); } voidTestProtected() { Teacherteacher("李四",35,"副教授"); teacher.ShowInfo();//错误,基类Person的ShowInfo此时对Teacher相当于protected的,外部不可以被访问 cout<<endl; teacher.ShowTeacherInfo(); } classLeader:publicTeacher { public: Leader(conststring&name,intage,conststring&title,stringposition) :Teacher(name,age,title),m_position(position) { } voidShowLeaderInfo() { ShowInfo();//基类Person的ShowInfo此时相当于protected的,但子类仍可以访问 ShowTeacherInfo();//ShowTeacherInfo仍然是public的,可以访问 cout<<m_position<<endl; } private: stringm_position; }; classLeader:publicTeacher { public: Leader(conststring&name,intage,conststring&title,stringposition) :Teacher(name,age,title),m_position(position) { } voidShowLeaderInfo() { ShowInfo();//基类Person的ShowInfo此时相当于protected的,但子类仍可以访问 ShowTeacherInfo();//ShowTeacherInfo仍然是public的,可以访问 cout<<m_position<<endl; } private: stringm_position; };
以上所述是小编给大家介绍的C++的三种访问权限与三种继承方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!