虚函数、final、override

多态

统一父类指针做一般性处理,在实际执行时,指针可能指向子类对象,原本调用父类的方法,实际会调用子类同名方法

1、实现多态:虚函数

1、虚函数的定义:

在函数返回类型前加virtual

只有在成员函数声明中添加virtual,在成员函数实现时不要加virtual

2、虚函数的继承

1、如果某个成员函数被定义为虚函数,那么它的子类,以及子类的子类中,所继承的这个成员函数都是虚函数;

2、如果在子类中重写这个虚函数,可以不用写virtual,如果写可增加可读性;

3、虚函数表

VS的对象内存分布分析:

项目的命令行配置中添加: /d1 reportSingleClassLayout类名

内存分布:

1、对象内首先储存“虚函数表指针”又称虚表指针,然后再储存非静态成员;

2、对象的非虚函数,保存在代码中,对象的内存,只存虚函数表和数据成员,类的静态成员保存在数据区中,和对象分开储存;

3、添加虚函数后,对象内存空间不变,仅需函数表中添加对象,共享同一个虚函数表

4、使用继承的虚函数表

子类虚函数表的构建过程:

1、直接复制父类的虚函数表;

2、如果子类重写了父类的某个虚函数表,那么就会在虚函数表中进行相应的替换;

3、如果子类添加了新的虚函数,就会吧这个虚函数添加在虚函数表尾部。

5、多重继承的虚函数表

1、会根据继承父类的个数来创建相应的虚函数表(如继承2个父类就创建2个虚函数表),创建顺序由代码写的顺序;

2、如果重写,就会根据重写的哪个父类,在对应虚函数表中进行替换;

2、final

1、用来修饰类,该类不可被继承(如:class Father final : public Son);

2、用来修饰虚函数,改虚函数在子类中不可被重写(如:virtual void text() final);

3、override

仅用于修饰虚函数

作用:1、提高代码可读性,标记此函数为重写父类功能;

​ 2、防止写代码时重写父类函数时,写错函数名(如:void text() override);

4、当父类指针指向子类时,不调用子类析构函数

解决办法:在父类析构函数前加virtual

注意:1、为防止内存泄漏,最好在父类析构函数上加virtual,使父类析构函数变为虚函数;

​ 2、目的在于当使用delete释放基类指针时,会实现动态析构;

​ 3、如果父类指向父类,那么只调用父类析构函数;

​ 4、如果指向子类,那么会先调用子类再调用父类的析构函数。

5、纯虚函数

提供一个接口,让子类来实现,此方法就可以定义为纯虚函数,包含纯虚函数的类就称为抽象类。

用法:纯虚函数使用virtual和=0;不做实现

当父类声明某纯虚函数后那么它的子类注意事项:

1、实现这个纯虚函数;

2、继续把这个纯虚函数声明为纯虚函数,那么子类也为纯虚函数;

3、不做任何处理,等于上一直情况。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值