[C/C++]继承、多态和虚函数整理

关于C++中虚函数
1.怎么初始化基类的构造函数
在派生类中,通过参数初始化表可以对基类的构造函数传递参数,进行初始化

2.多重继承的二意性问题;可以将第二层派生类声明为虚基类(尽量不要使用多重继承)
class B:virtual public A    class C:virtual public  A    class D:public B,public C
在派生类D中不仅要对A初始化,还要对虚基类BC初始化,C++编译器不会调用虚基类对基类构造函数的调用,
只会执行最后派生类对基类构造函数的调用。从而保证公共基类的参数没有二义性。

3.基类和派生类的转换
基类的指针可以指向派生类,只是内存指向空间变短,指向的只是从基类继承的部分;
基类型的引用传递可以用派生类引用代替,同样会丢失派生类自己的成员;
派生类只可以向上做类型转换,以及赋值,会丢失精度;
不能向下做类型转化,只能向下做指针指向;

4.继承与组合关系
继承关系解决的是“是”的关系,如猫、白猫、黑猫等就是“是”的关系
组合关系解决的是“有”的关系,如猫有四只爪子,一条尾巴等

5.类库C++
类库中的类的声明一般是放在头文件中,类的实现是单独编译的,以目标代码的形式放在系统某一个目录下,
用户使用类库是不用了解这些源代码,但是必须头文件的使用方法和库的连接方法

基类是单独编译的,在程序编译时只需对派生类新增的功能进行编译,提高了效率。如果修改了基类,只要保证基类的公用接口不变,
派生类就不用修改,但基类要重新编译,派生类也要重新编译,否则不起作用。

使用类库,用户不知道成员函数的实现源码,保证基类类型安全;基类有时候只是一个通用的框架,或者是高级抽象,或者通用数据结构,
供用户在此基础上添加功能。

6.设计类的层次结构
面向对象的开发过程中,需要精心设计类的层次结构,从抽象层到具体实现层,蹭蹭递进,不断变为具体。需要从系统的角度去考虑。

7.多态性:一个结构,多种实现方法
静态多态是通过函数重载实现,运行前就决定了要执行的方法,实现效率高;动态动态是通过虚函数实现的;

8.注意:派生类的析构函数要定义成虚函数,这样可以当析构指向派生类的积累指针对象时,让派生类也发生析构,否则派生会变成一个悬挂指针。
同样基类的同名函数也要加上virtual声明,这样就可以用指向派生类的基类指针,可以正常调用派生类的同名函数,不会发生类型精度损失。

9.基类中virtual声明函数在派生类的同名函数自动变成虚函数,析构函数必须声明为虚函数,派生类中的函数可以加virtual,也可以不加virtual,最好加上
与函数重载不同,虚函数可以与基类中的函数一模一样,而函数重载则参数名称和数量不能一样。
访问不同类层次的同名函数时,只需要将当前指针转换为相应的类。即可通过prt->fun()访问(运行时确定调用哪一个对象的函数:动态关联的过程)
虚函数实现多态性的实质,是动态关联实现的;重载是静态关联(binding)
如果基类的析构函数被声明为虚函数,那么派生类的析构函数也自动变成了虚函数。

10.纯虚函数
格式:virtual type name (paralist) =0;
含有纯虚函数的类为抽象类,抽象类不能实例化,如果派生类仍然没有实现基类定义的纯虚函数,则此派生类扔为抽象类,仍然不能实例化
如果此虚函数在派生类没有定义,这此函数仍为纯虚函数,虽然不能实例化抽象类,但可以定义这种类型的指针变量,用来指向派生类,调用派生类的虚函数。
抽象基类是本类族的公共接口;name.fun();属于静态关联;ptr->fun();属于动态关联;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值