Android C++系列:C++最佳实践1虚函数(1)

}
class Sub:public Base{
public:
void action();
}
void Sub::action(){
std::cout>>(“in Sub”);
}
static void main(){
Base *b = new Base();
b->action();
b = new Sub();
b->action();
}


打印的结果是:



in Base
in Base


就算是b指向了Sub对象,但是打印的还是Base的方法,没有自动绑定,写惯了Java后马上慌了,怎么破。这里就需要用到我们今天的主人公”虚函数“了,在方法声明之前加上virtual这个函数就变成虚函数。我们在Base的action方法声明前加上virtual打印结果就变成了:



in Base
in Sub


当前仅当对通过指针或引用掉用虚函数时,才会在运行时解析该调用,也只有这种情况下对象的动态类型才有可能与静态类型不同。


### 3. 虚函数注意点


1. 基类通过在其成员函数的声明语句之前加上关键字virtual使得该函数执行动态绑定。如果基类把一个函数声明成虚函数,则该函数在派生类中隐式地也是虚函数。派生类可以在它覆盖的函数前使用virtual关键字,但是不是强制的。
2. 如果我们想将某个类作基类,则该类必须已经定义而非仅仅声明。因为派生类中包含并且可以使用它从基类继承而来的成员,为了使用这些成员,派生类当然要知道它们是什么。一个类不能派生它本身。
3. 如果在基类中含有一个或多个虚函数,我们可以使用dynamic\_cast请求一个类型装换,这个转换的安全检查在运行时执行。同样,如果我们已知某个基类向派生类的转换是安全的,我们可以使用static\_cast来强制覆盖掉编译器的检查工作。
4. 如果我们不使用某个函数,则无须为该函数提供定义,但是我们必须为每一个虚函数都提供定义,而不管它是否被用到,因为连编译器也无法确定到底会使用哪个虚函数。
5. 派生类中虚函数的返回类型必须与基类函数匹配。例外的情况是,当类的虚函数返回类型是类本身的指针或引用时,不需要遵循这个规则。如果Impl由Base派生,则基类的虚函数可以返回`Base*`,而派生类的对应函数可以返回`Impl*`,这样的返回类型要求从Impl到Base的转换是可访问的。
6. 我们可以把某个函数指定为final,如果已经把函数指定为final,则之后任何尝试覆盖该函数的操作都将引发错误。
7. 如果虚函数使用默认实参,则积累和派生类中定义的默认实参最好一致。
8. 如果我们不想对虚函数的调用执行动态绑定,可以使用作用域运算法强迫执行虚函数的某个特定版本。通常情况,只有成员函数(或友元)中的代码才需要使用作用域运算法来回避虚函数的机制。在Java中子类调用父类被重写的方法直接`super.xxx()`即可,在C++中要强制使用某个版本的虚函数,必须使用该版本对应的类加`::`作用域,如`Base::action()`。我们Java中如果想调用父类的父类的被覆盖的方法就有点困难了,这一点C++反而更有优势了。
9. 如果一个派生类虚函数需要调用它的基类版本,但是没有使用作用域运算符,则在运行时该调用将被解析为对派生类版本自身的调用,从而导致无限递归。


### 4. 总结


作为Android方向C++系列文章,不仅介绍C++相关的知识,Android主要开发语言是Java,文章中尽量会对比Java和C++实现的一些不同,以及一些优劣对比。本文介绍了C++多态的基础虚函数,对比了和Java版本实现多态的差异。


##### 最后


**代码真的是重质不重量,质量高的代码,是当前代码界提倡的,当然写出高质量的代码肯定需要一个相当高的专业素养,这需要在日常的代码书写中逐渐去吸收掌握,谁不是每天都在学习呀,目的还不是为了一个,为实现某个功能写出高质量的代码。**


所以,长征路还长,大家还是好好地做个务实的程序员吧。


最后,小编这里有一系列Android提升学习资料,有兴趣的小伙伴们可以来看下哦~


我的 Android 学习,面试文档,视频收集大整理


如果你有需要的话,**可以扫描二维码**![在这里插入图片描述](https://img-blog.csdnimg.cn/9257c9a84d8d4b7992baea79d191faca.png)





### 重要知识点

下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。

![ ](https://img-blog.csdnimg.cn/img_convert/3248a69648da2e1ecf5e22ae9ff44d16.webp?x-oss-process=image/format,png)

**高级进阶篇——高级UI,自定义View(部分展示)**

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

![](https://img-blog.csdnimg.cn/img_convert/7fb3deb06b412ac68a77b5b9d9f9461b.webp?x-oss-process=image/format,png)

* **面试题部分合集**
  ![](https://img-blog.csdnimg.cn/img_convert/591f50997fb8d551460fc9793aeb43ce.webp?x-oss-process=image/format,png)

  

加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
ogqhguF-1725631106884)]

  

加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值