第十二章 继承

第十二章 继承

1.  什么是继承和派生?

继承:

派生:

2.  复杂的继承和派生.

3.  继承和派生如何在C++中实现.

4.  单一继承.

在实际应用中可以将 基类和派生类视为一个整体

5.  保护成员.

封装的含义:

为了解决这个问题我们引进了protected。

6.  公有派生的公有成员.

子类可以直接调用

7.  公有派生的保护成员.

子类可以通过自己间接访问

8.  公有派生的私有成员.

子类只能通过父类间接访问

在派生类中对基类成员的访问限定 其中public protected private的意思是可以访问 但是访问来的基类成员变成了相应的public
protected private类型成员

9.  继承的赋值.

只能小的调用大的,父类调用子类

到底是类型转换还是赋值??????????????????

见程序12-3-1

10.  私有派生.

11.  多重继承.

12.  继承的构造与析构.

//单一继承的构造顺序:先父类后子类

//多重继承的构造顺序:e,b,c,d,a

13.  向基类构造函数传递参数.

只调用父类无参构造函数

弊端: 这样导致成员变量必须要protected

调用父类有参构造函数

优势: 成员变量可以使private

还有子类成员在花括号内定义

14.  多重继承容易产生两义性.

产生原因: 当多个基类中有相同的函数, 用子类定义的类调用该函数时

解决方法:加作用域限定符

① 

② 

9.  继承中的重载.

子类会屏蔽掉父类的同名函数,不论参数是否不同.

说明const也可以成为重载标示符

16.  两义性的归属问题.

产生原因: 当子类继承类father mother ,而father mother又从human类继承 , 用子类定义的类调用human中的函数

解决办法 见 14两种

③还可以单一继承

17.  虚基类不会产生两义性.

④在中间父类加virtual

本章总结:

1.  继承:***********************①

派生方式                           
基类的访问限定                                
派生类中对基类成员的访问限定                                    
主函数中访问派生类对象的基类成员

共有派生                           
public                                                     
public                    
                     
                     
                     
   可以直接访问

protected  
                     
                     
 
protected                                                                                   
不可直接访问

private  
                     
                      
 不可直接访问                  
                     
                     
               不可直接访问

私有派生                           
public                    
                     
         
 private                                                                                        
不可直接访问

protected  
                     
                     
 
private                                                                                        
不可直接访问

private                                                   
不可直接访问                                                                          
   不可直接访问

2.  继承的赋值:只能小的调用大的,父类调用子类(虚函数处有用)

Father       
A;                                          
A=B           √

Father       
*f;                                         
B=A          
×     //B.operator=(B      
&r){}//r用A传,A填不满B

Son   
B;                                                   
f=&B         √

Son   
*s;                                                 
S=&A        ×    
//S的范围大,要是移动的话,就超出A对象了。就会出错

3.  子类会屏蔽掉父类的同名重载函数(见word文档)**********************②

4.  解决两义性的方法:

①子类中添加同名函数

②加作用域限定符class Son:class father,class mother{};    Son XiaoMing;
XiaoMing.father::x();

③单一继承

④虚基类virtual(见word文档)

class human{public: stand(){cout<<”人可以直立行走\n”;}};

class father:virtual public human{public};

class mother:virtual public human{public};

class son:public father,pblic mother{public};

son XiaoMing;

XiaoMing.stand();

5.  继承的构造与析构

①单一继承的构造顺序:先父类后子类。(父类的构造函数,不论有无调用都要构造一遍)

②class f:public e,public b, public c

多重继承的构造顺序:e, b, c

  1. 基类的构造函数,一般由派生类传递初始值。

派生类成员一般在{}内定义,用于增加代码的可读性。

Son::Son(int x, int y, int z, int t):Fobject(x,y){c=z;d=t;}

7.                       
重载                      
                     
                      覆盖
                     
                     
                     
    隐藏

共同点:        
函数名相同

不同点:         同类、参数类型、数量不同 或
有无const                
不同类,同参,有基virtual                            
不同类,同参,且无virtual

不同类,不同参(不论有无virtual)

体现:             
由函数调用(静态联编)                  
               
 取决于object(动态联编)                   
         取决于pointer(不能体现多态性)


 1 /**
2 1.继承:***********************①
3 派生方式 基类的访问限定 派生类中对基类成员的访问限定 主函数中访问派生类对象的基类成员
4 共有派生 public public 可以直接访问
5 protected protected 不可直接访问
6 private 不可直接访问 不可直接访问
7 私有派生 public private 不可直接访问
8 protected private 不可直接访问
9 private 不可直接访问 不可直接访问
10 2.继承的赋值:只能小的调用大的,父类调用子类(虚函数处有用)
11 3.子类会屏蔽掉父类的同名重载函数(见word文档)**********************②
12 4.解决两义性的方法:①子类中添加同名函数②添加作用域限定符③单一继承④虚基类virtual(见word文档)**********************③
13 */
14
15 #include"iostream"
16 using namespace std;
17 class father
18 {
19 private:
20 int a;
21 protected:
22 int pa;
23 public:
24 father(){cout<<"father的无参构造\n";}
25 father(int m,int n){a=m;pa=n;cout<<"father的有参构造"<<a<<" "<<pa<<endl;}
26 ~father(){cout<<"father的析构\n";}
27 };
28
29 class son:public father//class son::virtual public father 虚基类
30 {
31 private:
32 int b;
33 protected:
34 int pb;
35 father Fobject;
36 public:
37 son(){cout<<"son的无参构造\n";}
38 son(int x,int y,int z,int t);
39 //派生类中初始化基类构造函数(有优势)
40 //不初始化就会调用father的无参构造函数
41 ~son(){cout<<"son的析构\n";}
42 };
43 son::son(int x,int y,int z,int t):b(z),Fobject(x,y)
44 {pb=t;cout<<"son的有参构造"<<b<<" "<<pb<<endl;}
45 int main()
46 {
47 son Sobject(3,4,5,6);//为什么这里要调用无参的构造函数?
48
49 return 0;
50 }

时间: 2024-07-30 10:17:55

第十二章 继承的相关文章

Java 第十二章 继承 笔记

Java 第十二章  继承 笔记 一.使用继承:     1)方便修改代码     2)减少代码量 二.super 继承object 类:super 访问父类的无参构造:super 指的是object 的无参构造.     例:子类调用父类:super.属性 / super.方法    注意:子类不能继承父类私有属性:得用set.get方法来调用:    super只能写在代码块的第一句:super只能调用非私有的方法:    super只能出现在子类的方法和构造方法中. 三.不能被继承的父类成

第十二章 多态性与抽象类

第十二章 多态与虚函数 一.多态的概念 向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为 具有不同功能的函数名可以用同一个函数名,以实现用一个函数名调用不同内容的函数 *静态多态和动态多态(编译时的多态性和运行时的多态性) 静态多态的特点:调用速率快.效率高,但缺少灵活性,在程序运行前就已经决定了执行的函数和方法 动态多态的特点:不在编译时确定调用的是哪个函数,只有在程序运行时才动态确定操作所针对的对象.动态多态是通过虚函数实现的. 二.利用虚函数实现动态多态性 *虚函数的作用 函

Gradle 1.12用户指南翻译——第二十二章. 标准的 Gradle 插件

其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,兼容

Java(第十二章)

第十二章 一.变量的作用域(有效的使用范围) 1.变量有2种 1.1成员变量(属性) 声明在类的里面,方法的外面 1.2 局部变量 声明在方法里面或for循环结构中 2.调用时的注意事项(初始值不同.作用域不同) 2.1 成员变量,有默认值 在当前类直接通过成员变量名调用:在其他类中,通过该类的对象名.属性(成员变量)名调用:成员变量名称在同一个类中是唯一的. 2.2 局部变量,没有默认值,必须先赋值再使用 局部变量,只能在当前的方法中使用,其他方法和其他类不能调用:在同一个方法中名称是唯一的,

第四十二章

第四十二章1 道生“肾” 道生一,一生二,二生三,三生万物. 道生出混沌之气,混沌之气分出阴阳,阴阳又交汇出新的物质,从而生出万物. 道在我们身体内体现为“肾精”,要保护好.各位朋友大家好,今天我们接着来聊<道德经>.我们来看看老子带给我们什么样新的人生启发了,每天启发一点,天天进步.今天我们开始学习第四十二章,非常开心.因为我们<道德经>已经学习到一半的位置了,因为整个八十一章,我们学习到第四十二章了,过了一半了,这时间也是飞快的.我之前预计3年,我估计现在2年差不多讲完了.因为

20190925 On Java8 第二十二章 枚举

第二十二章 枚举 基本 enum 特性 创建 enum 时,编译器会为你生成一个相关的类,这个类继承自 Java.lang.Enum. valueOf() 是在 Enum 中定义的 static 方法,它根据给定的名字返回相应的 enum 实例,如果不存在给定名字的实例,将会抛出异常. 将静态类型导入用于 enum 使用 static import 能够将 enum 实例的标识符带入当前的命名空间,所以无需再用 enum 类型来修饰 enum 实例. 方法添加 除了不能继承自一个 enum 之外

Java编程思想---第十二章 通过异常处理错误(中)

第十二章  通过异常处理错误(中) 12.4 创建自定义异常 我们不必拘泥于Java中已有的异常类型,Java提供的异常体系不可能预见所有的错误,所以可以自己定义异常类来表示程序中可能会遇到的特定问题:要自己定义异常类,必须从已有的异常类继承,最好是选择意思相近的异常类继承,建立新的异常类最简单的方法就是让编译器为你产生默认构造器,所以这几乎不用写多少代码: class SimpleException extends Exception { } public class InheritingEx

【WPF学习】第三十二章 执行命令

原文:[WPF学习]第三十二章 执行命令 前面章节已经对命令进行了深入分析,分析了基类和接口以及WPF提供的命令库.但尚未例举任何使用这些命令的例子. 如前所述,RoutedUICommand类没有任何硬编码的功能,而是只表达命令,为触发命令,需要有命令源(也可使用代码).为响应命令,需要有命令绑定,命令绑定将执行转发给普遍的事件处理程序. 一.命令源 命令库中的命令始终可用.触发他们的最简单的方法是将它们关联到实现了ICommandSource接口的控件,其中包括继承自ButtonBase类的

C和指针 (pointers on C)——第十二章:使用结构和指针

第十二章 使用结构和指针 这章就是链表.先单链表,后双向链表. 总结: 单链表是一种使用指针来存储值的数据结构.链表中的每个节点包含一个字段,用于指向链表的下一个节点. 有一个独立的根指针指向链表的第1个节点.单链表只能从一个方向遍历. 如何insert单链表:1.新节点的link字段必须设置为指向它的后面节点.2.前一个节点的link字段必须指向这个新节点. 为了防止可能会插入链表的起始位置这种情况,在C中,可以保存一个指向必须进行修改的link字段的指针,而不是保存一个指向前一个节点的指针.