首页 > 其他分享 >day05

day05

时间:2023-08-30 20:33:07浏览次数:38  
标签:继承 子类 day05 Son Base 父类 指针

一、什么是继承     1、当遇到问题时,先查看现有的类是否能解决一部分问题,如果有则继承该类,并在此基础上扩展以此解决问题,从而缩短解决问题的时间(代码复用)     2、当遇到一个大而复杂的问题时,可以把大问题拆分成若干个不同的小问题,然后为每个小问题设计一个类来解决,最后通过继承的方式把这些类汇总到一个类中,从而解决大问题,以此降低问题的难度,可以同时让多个程序员共同解决大问题       派生类继承基类  子类继承父类
二、继承语法     1、继承表     class Son : 继承表[继承方式 父类名1,继承方式 父类名2,···]     {         成员变量;     public:         成员函数;     };     2、继承方式     public     private     protected
三、继承的特点     1、C++中的继承可以有多个父类     2、子类会继承父类的所有内容,是否能用另说     3、子类对象可以向它的父类类型转换(缩小),但是父类对象不能向子类类型转换(放大)         父类指针或引用可以指向子类对象,但是子类指针或引用不能指向父类对象         前提:必须以public继承父类         Base* b = new Son; true         Base* b = son;     true                 Son* s = new Base; false         Son* s = base;     false     4、子类会隐藏父类的同名成员(成员变量、成员函数),不构成函数重载,因为作用域不同         同名成员被隐藏后,在子类中直接访问到的是子类的同名成员         但是可以通过 父类名::同名成员名 的方式来指定访问父类同名成员     5、在执行子类的构造函数的初始化列表时,会按照继承表的顺序来执行父类的构造函数,默认执行的是父类的无参构造,但也可以在子类的初始化列表中显式地调用父类的有参构造,然后再执行类类型成员的构造函数,最后执行子类的构造函数         Son(int num):Base(val){} //调用Base的有参构造         Son(int num){}           //调用Base的无参构造     6、在子类的析构函数执行后,再调用类类型成员的析构函数,最后按照继承表逆序调用父类的析构函数     7、当子类执行拷贝构造时,默认下只会调用父类的无参构造,这是有问题的,因此需要在子类的拷贝构造函数的初始化列表中显式地调用父类的拷贝构造函数         Son(const Son& that):Base(that){} //调用Base的拷贝构造  //父类引用可以指向子类对象     8、当子类指向赋值函数时,默认下不会调用父类的赋值函数,如果需要调用父类的赋值函数可以在子类的赋值操作函数中通过域限定符显式地调用父类的赋值操作函数             Son& operator=(const Son& that)             {                   A::operator=(that);             //调用Base的赋值操作函数                 cout << "son的赋值操作" << endl;             }  
四、继承方式与访问控制属性     访问控制属性:对成员的访问范围限制                     public      可以在任意位置访问                     protected   只能在类内或者子类中访问                     private     只能类内访问     继承方式的影响:         1、父类的成员是否能在直接子类中访问取决于父类的访问控制属性,而不受继承方式影响         2、子类的继承方式能决定父类成员被子类继承后,在子类中变成什么样的访问控制属性             (*背*)关系表                     3、只有以public方式继承父类,父类的指针或引用才能指向子类对象,这也是多态的基础
五、多重继承和钻石(菱形)继承     1、什么是多重继承:         当一个子类继承多个父类时称为多重继承,会按照继承表的顺序在子类中排列父类的内容,当使用父类指针指向子类对象,编译器会自动计算出该父类的内容在子类中的位置,并让父类指针指向该位置,所以可能会出现使用同一个子类指针给不同的父类指针赋值后,地址编号不同的情况     2、钻石(菱形)继承           假设有个类A,类B、C都分别继承类A,又有一个类D继承了类B和类C,一个类的父类有共同祖先类时,就形成了菱形继承         问题:             1、类B、类C中都各自都有类A的内容             2、类D会继承类B和类C的所有内容,就导致类D中继承了两份类A             3、当类D对象去访问类A的内容时就会有歧义,编译器不能确定访问的是哪份类A的内容,会报错     3、虚继承(常考)         使用 virtual 关键字去修饰继承表时,此时变成虚继承         此时子类中会多出一个成员变量(虚指针),用于指向父类的内容,并且当该子类被继承时该虚指针会一起被继承,如果此时形成钻石继承时,孙子类中就会有多个指向相同位置的虚指针,此时编译器会比较这些虚指针指向的内容是否一致,如果是则只继承一份
        总结:通过虚继承可以解决钻石继承中的访问共同祖先类内容有歧义的问题

标签:继承,子类,day05,Son,Base,父类,指针
From: https://www.cnblogs.com/ymy1/p/17668222.html

相关文章

  • day05
    进程管理一、进程的基本概念  1、进程与程序    程序是存储在磁盘上的可执行文件,程序被加载到内存中开始运行称为进程,一个程序可以同时加载成多个进程,进程就是处于活动状态下的程序  2、进程的分类    进程根据功能不同一般分为三种类型:交互进程、......
  • 20天 hot 100 速通计划-day05
    矩阵240.搜索二维矩阵II编写一个高效的算法来搜索*m*x*n*矩阵matrix中的一个目标值target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例1:输入:matrix=[[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[1......
  • day05课程回顾
    课程回顾运算符赋值运算符=+=-=*=/=%=赋值运算符默认强制类型转换位运算(了解)三目运算(掌握)boolean?数1:数2Scanner导包:importjava.util.Scanner;创建对象Scannerscan=newScanner(System.in);调用对象的方法san.nextInt()录入......
  • day05:运算符,Scanner
    day05:运算符,Scanner一、运算符赋值:=、+=、-=、*=、/=、%=简单赋值运算符:=扩展赋值运算符:+=、-=、*=、/=、%=注意:扩展赋值运算符自带强转功能inta=5;a+=10;//相当于a=(int)(a+10)System.out.println(a);//15a*=2;//相当于a=(int)(a*2)System.out.println(......
  • [代码随想录]Day05-哈希表 part01
    题目:242.有效的字母异位词思路:很简单,就是看两个字符串每个字母出现的次数是不是相同的。可以用两个数组来比较,也可以用一个数组比较。代码:一个数组funcisAnagram(sstring,tstring)bool{isExist:=[26]int{}//26个字母for_,ch:=ranges{isE......
  • Java学习Day05
    4.2.1、语法格式for(初始化表达式;循环条件;条件控制语句){执行语句………}在上面的语法结构中,for关键字后面()中包括了三部分内容:初始化表达式、循环条件和条件控制语句,它们之间用“;”分隔,{}中的执行语句为循环体。注意:(1)for(;;)中的两个;是不能多也不能少(2)循环条件......
  • Day05-22 多态
    多态即同一方法可以根据发送对象的不同而采用多种不同的行为方式一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类,有关系的类)多态存在的条件有继承关系子类重写父类方法父类引用指向子类对象注意:多态是方法的多态,属性没有多态性。ins......
  • Java学习day05~06: 面向对象
    我在B站上大学......
  • day05
    函数的定义假设现在你是下水道工,如果你事先准备好你的工具箱,等你接到修理下水道的工作的时候,你直接把你的工具箱拿过去直接使用就行了,而不需要临时准备锤子啥的。在程序中,函数就是具备某一功能的工具,事先将工具准备好就是函数的定义,遇到应用场景拿来就用就是函数的调用函数体系......
  • day05_与用户交互
    1.Python3的input用户输入所有内容为字符串: 2.Python3的input输入年龄需要int转为转类型: 3.Python2的raw_input和input用法: ......