多态的注意事项

多态

多态的定义:

​ 如果有几个似而不完全相同的对象,有时人们要求在向它们发出同一个消息时,它们的反应各不相同,分别执行不同的操作。这种情况就是多态现象。

c++中所谓的多态是指,由继承而产生的相关的不同的类,其对象对同一消息会作出不同的相应。

​ 多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。可以减轻系统,升级,维护,调试的工作量和复杂度

多态使用注意事项

(1)多态的发生有三个必要条件:

  1. 要有继承
  2. 要有虚函数重写
  3. 父类指针或引用指向子类对象

(2)如果传参是父类指针,又没有使用virtual,编译器会使用父类对象的函数

(3)虚继承和多态中的虚继承关键字virtual含义不相同

(4)迟绑定,动态判断的语句

(5)只需要析构子类,就会自动析构父类,因此将析构函数设定成虚函数。

(6)如果一个类有virtual虚函数关键字,在编译器给这个对象开辟空间时候回默认增加一个指针,vptr;函数匹配的时候会优先找虚函数表中,然后再找类中有没有静态实现的。

虚函数表

当一个类中有虚函数的时候,会在这个类中隐式生成一个虚函数指针,指向这个类拥有的虚函数表

​ 虚函数指针会在类里占用四个字节,在父类构造函数结束之前,指针指向父类虚函数表,到子类构造开始时,指针指向子类虚函数表
在这里插入图片描述
(1)通过虚函数表指针VPTR调用重写函数是在程序运行时进行的,因此需要通过寻址操作才能确定真正应该调用的函数。而普通成员函数是在编译时就确定了调用的函数。在效率上,虚函数的效率要低很多

(2)出于效率考虑,没有必要将所有成员函数都声明为虚函数。

(3)C++编译器,执行run函数,不需要区分是子类对象还是父类对象,而是直接通过p的VPTR指针所指向的对象函数执行即可

(4)父类指针和子类指针的步长不同

  • 二者指向的地址空间大小可能不同

纯虚函数

(1)不管类中有没有成员属性,只要这个类有纯虚函数就是一个抽象类,抽象类不能够实例化。

(2)如果继承类不重写纯虚函数,仍然是一个抽象类,必须重写所有纯虚函数

(3)抽象类就是接口,main函数可以只与抽象类关联,依赖倒转原则:高层业务逻辑层向抽象层,实现层向抽象层

(4)如果多继承,可以用同时两个父类指针指向该类:

class Interface
{
//......func1,func2,func3
};
class Child : public Interface
{
//......
};
Interface *if1 = new Child;
if1->func1();
if1->func3();
Interface *if2 = new Child;
if2->func2();

静态和的动态连编

(1)联编是指一个程序模块、代码之间互相关联的过程

(2)静态联编,是程序的匹配、连接在编译阶段实现,也称为早期匹配。重载函数使用静态联编

(3)动态联编是指程序联编推迟到运行时进行,所以有称为晚期联编。switch语句和if语句是动态联编的例子

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值