读书笔记-----类继承

面向对象编程的主要目的之一是提供可重用的代码,通过类继承就可以达到这一目的。

类继承可以完成下面的工作:在已有类的基础上添加功能,给类添加数据,修改类的方法。

从一个类派生出一个类时,原始类称为基类,继承类称为派生类。

派生类的基本格式为:class class_name:public class_name1{................},其中class_name为派生类,class_name1为基类,public说明这个基类为公有基类,这种派生为公有派生,在公有派生中,基类的公有成员将成为派生类的公有成员,基类的私有部分也将成为派生类的一部分,不过只能通过基类的公有和保护方法访问。

派生构造函数必须使用基类的构造函数。创建派生类对象时,程序首先创建基类对象,派生类构造函数通过成员初始化列表将基类信息传递给基类构造函数,派生类构造函数应该初始化派生类新增的数据成员。基类指针可以在不进行显式类型转换的情况下指向派生类对象,基类引用可以在不进行显式类型转换的情况下引用派生类对象,但是这种指针和引用只能调用基类方法,不能调用派生类新增的方法,而且这种方式是单向的。

在C++中有三种继承方式:公有继承、私有继承和保护继承。

公有继承

公有继承是最常用的继承,它建立了一种is-a关系,即派生对象也是一个基类对象,可以对基类对象执行的任何操作,也可以对派生类对象执行。有一种公有继承,同一种方法在在派生类和基类中的行为是不同的,这种继承叫做多态公有继承,可以通过在派生类中重新定义基类的方法和使用虚方法这两种重要的机制实现多态公有继承。如果要在派生类中重新定义基类的方法,通常应将基类方法声明为虚拟的,这样,程序将根据对象类型而不是引用或指针的类型来选择方法版本。

静态联编和动态联编

首先解释一下联编,将源代码中的函数调用解释为执行特定的函数代码块被称为函数名联编。在C++中,编译过程中进行联编被称为静态联编,但是虚函数的存在使静态联编变得困难,这时使用哪一个函数不能在编译时确定,因为编译器不知道用户将选择哪种类型的对象,所以编译器必须生成能够在程序运行时选择正确的虚拟方法的代码,这被称为动态联编。

编译器对非虚拟方法使用静态联编,对虚拟方法使用动态联编。如果要在派生类中重新定义基类的方法,则将它设置为虚方法,否则设置为非虚方法。

构造函数

构造函数不能是虚函数,创建派生对象时,将调用派生类的构造函数,而不是基类的构造函数,然后派生类的构造函数将使用基类的一个构造函数,派生类不继承基类的构造函数。

析构函数

析构函数应该为虚函数,除非类不作为基类。但是给非基类定义一个虚拟析构函数并不是一个错误的举动,只是会引起程序的效率问题。

友元不能是虚函数,因为它不是类成员,只有成员才能是虚函数。

访问控制:protected

private和protected的区别只有在基类派生的类中才会表现出来,派生类的成员可以直接访问基类的保护成员,但不能直接访问基类的私有成员。当然最好对类的数据成员采用私有访问控制,不要使用保护访问控制,同时应保证派生类能通过基类的方法访问到基类数据。

ABC

ABC为抽象基类,至少包含一个纯虚函数。当类中包含纯虚函数时,不能创建该类的对象。抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类没有重新定义纯虚函数,而派生类只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体类了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值