c++-基础部分-多态-小总结

清华大学出版社《c++程序设计》(第三版)中简单总结的一些知识点

  • 在面向对象方法中:多态性指的是同一操作作用于不同类的实例时,将导致不同的执行结果,即不同类的对象在接收到相同消息时,将有不同的处理方式。
  • 在C++中,通过多态性,因继承而相关的不同的类,他们的对象可以对同一个函数调用做出不同的相应。
    ○ “同一个函数调用”指同一条函数调用语句
    ○ “不同的响应”是指执行了不同的函数
  • 使用多态性可以在不需要判断对象类型以及不修改程序的情况下正确地操作不同类型的对象
  • 静态绑定和动态绑定
    ○ 静态绑定:编译器为每一条函数调用的语句确定它将执行的函数体,确定要跳转到的代码的绝对地址。即在编译时就能确定函数调用语句和实际执行的函数关系的机制,就是静态绑定
    ○ 给对象发消息时(调用对象成员函数时),编译器暂不确定将被调用执行的代码,他只要保证被调用的函数存在,并对函数进行参数列表和返回值类型的检查。当程序真正运行时,再由接收消息的对象根据自己的类型来确定具体调用哪个函数。这种在运行时才能确定调用的函数的机制,称为动态绑定。
  • 多态性的实现:通过虚函数来实现。只有通过基类的指针或引用来调用虚函数时,才会对被调用的函数进行动态绑定,即根据接受消息对象的类型(而不是指针或引用的类型来确定要调用的函数)。为编程带来很大的灵活性。
  • 多态性意义:实现同一对外接口,不同内部实现,把控制模块与被操作对象分开,提高程序的可扩展性。
  • 多态性的实现:通常方法(用链表或数组组织所有对象,然后用基类指针去遍历他们)
  • 虚函数
    只用在基类中声明虚函数时,在虚函数之前加上关键字virtual。函数的实现或者派生函数中都不用加virtual了,在所有派生类中他都是虚函数。
  • 纯虚函数:没有函数体的虚函数,在声明时要初始化为0:virtual double area()=0;
  • 抽象类:包含纯虚数的类称为抽象类,不能用来创造实例化对象,它存在的意义在于它们将作为基类被其他类继承(提供共同的框架和接口),如果继承它的派生类中没有提供所有纯虚函数的实现,那么该派生类也是一个抽象类,否则就是具体类。
  • 可以在顶层使用classA抽象类作为基类。设计一个函数func(classA &obj),通过基类的引用来引用派生类classB的对象obj,调用虚函数,引发动态绑定,调用了派生类obj中定义的函数obj.###。func就是一个与接口classA有关,而与实现该接口的具体类classB无关的程序模块,实现(具体类中###函数的定义)和控制(调用obj.###的函数func)无关,显著地提高了程序地可维护性课可扩展性p369中的解释。
  • 虚折构函数
    类的构造函数不能时虚函数,但是折构函数可以是虚函数(在很多时候,最好被声明为虚函数)
    原因: 用指针去操作动态生成的对象时,用new创建派生类时,new是根据后面的操作数指明的类型来创建对象的,用基类指针来控制该对象没有问题,但是用delete运算符撤销动态创建的对象就会有问题,用delete运算符作用于一个类指针,不管指针具体指向的是什么类型的对象,该操作调用的折构函数始终是声明该指针所使用的类的折构函数,在这里如果是用基类指针指向派生类对象,这里调用的就是基类的折构函数,这明显与派生类执行折构函数的方式不同(从下到上到基类),对象就不能正确地撤销。
    解决方案:面对这样的问题,最简单地方法就是将折构函数定义为虚函数,这样执行的就是所指对象的实际类的折构函数,而不是声明指针时的参数。 virtual ~Test();可以将基类中的折构函数声明为虚函数,那么派生类中的就自动是虚函数了。

封面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值