【C++】封装、继承和多态

【C++】封装、继承和多态 文章目录一、封装二、继承三、多态一、封装通俗来说就是将拥有共同属性和行为的东西封装成一个类类可以实例化为多个对象每个对象都具有相同的属性和行为。比如学生是一个类每个学生都拥有共同的属性和行为姓名、学号、家庭地址以及登记信息的行为。这些属性和行为又可以设定不同的访问权限公共、保护和私有权限。class Student{public://公共权限 在类内可以访问在类外也可以访问string name;protected://保护权限 在类内可以访问在类外不能访问intxuehao;private://私有权限 在类内可以访问在类外不能访问string addr;public:voidset(string m_name,intm_xuehao,string addr){//在类内可以访问namem_name;xuehaom_xuehao;addrm_addr;}};//也可初始化列表改写为://void test(string m_name,int m_xuehao, string addr):name(m_name),xuehao(m_xuehao),addr(m_addr){};intmain(){Student S;//School为类 S为类实例化得到的对象S.set(lili,124,xian);//公有权限可访问coutS.nameendl;//S.name可访问 S.addr和S.xuehao都不能访问}Student类中的name、xuehao、addr、set() 统称为类的成员其中属性 name、xuehao、addr 称为成员属性行为set()称为成员函数小tip:struct 和 class的区别?struct 的默认权限为公共权限class 的默认权限为私有权限二、继承每个班级的学生都有上面的属性和行为此时若要将一个班级的学生归为一类就要在学生这个类的基础上再定义一个班级的类。那么学生就是父类班级就是子类子类继承父类的成员。//仅以继承权限为public为例 若class Banji : protected Student{};或者class Banji : private Student{};情况会有所不同class Banji:public Student{//子类继承父类的属性和行为public:voidwholetest(string m_name,intm_xuehao,string m_banhao){//考试行为namem_name;// 父类的公共权限子类可以访问xuehaom_xuehao;//父类的保护权限子类可以访问//addr m_addr;//父类的私有权限子类不可访问banhaom_banhao;//子类的私有权限}private:string banhao;};intmain(){Banji A;//对象AA.set(lili,124,xian);//子类继承父类的成员函数,成员函数set可以访问私有权限的addr因为set()是属于Student父类类内可以访问私有权限的成员A.wholetest(lili,124,3班);coutA.nameendl;//A.name可访问//A.xuehao不能访问,xuehao是School的保护成员//A.addr不能访问addr是School的私有成员//A.banhao不能访问banhao是Banji的私有成员}三、多态多态分为两类静态多态 : 函数重载 和 运算符重载属于静态多态复用函数名动态多态 : 派生类和虚函数实现运行时多态静态多态和动态多态区别:静态多态的函数地址早绑定 - 编译阶段确定函数地址动态多态的函数地址晚绑定 - 运行阶段确定函数地址动态多态满足条件1、有继承关系2、子类重写父类的虚函数现在有A和B两个班级都继承Student类Student 类里面创建了一个虚函数test()子类 Banji_A 和Banji_B要在各自的类里重写这个函数test()test()在两个子类中的内容可能不同但是可通过 父类的指针或者引用 指向子类对象 来实现动态多态。class Student{public:virtualvoidtest(){////在多态中通常父类中虚函数的实现是毫无意义的主要都是调用子类重写的内容cout学生考试endl;}};class Banji_A:public Student{//子类继承父类的属性和行为public:voidtest(){//子类重写父类的虚函数coutA班学生考试endl;}};class Banji_B:public Student{//子类继承父类的属性和行为public:voidtest(){//子类重写父类的虚函数coutB班学生考试endl;}};// 动态多态使用// 父类的指针或者引用 指向子类对象voiddoTest(Students){//父类的引用指向子类s.test();}voidmain(){Banji_A a;doTest(a);//输出A班学生考试Banji_B b;doTest(b);//输出B班学生考试}/* void doTest(Student *s) { //父类的指针指向子类 s-test(); } void main() { doTest(new Banji_A );//输出A班学生考试 doTest(new Banji_B); //输出B班学生考试 }