谈谈C++中三个容易混淆的概念
2012-02-23 16:31
260 查看
JAVA中语言中方法(函数)调用有两种特殊的形态:重载与重写;而C++由于增加了virtual这个虚函数关键字,给函数调用又增加了变数:除了重载、重写(也称覆盖)之外还多了隐藏这么一说。
我相信我们绝大多数人写代码时,为了程序的可读性与赶速度的原则,下意识的避开这些类似于脑筋急转弯的语法,尽量使用不同的函数名来区分基类与派生类的函数(当然,不能避开的时候也是非常多的)。
可是有时候,有些面试主考官总喜欢拿这三个概念去为难你,考察你的C++基础是否牢固。所以为了面试、这三个概念还是需要我们去区分一下。
说点个人比较偏激的观点:重载、重写是必须要知道,因为用途太广泛;至于隐藏吗,完全是C++为面试官设计的(^_^等待挨砖)。
1、重载的特征:在同一个类中;函数名字相同;参数不同;virtual 关键字可有可无。
2、重写(覆盖)特征是:分别位于派生类与基类;函数名字相同;参数相同;基类函数必须有virtual 关键字(这点非常要注意)。
2、隐藏
个人认为以上两点比较容易记得住,但是C++的隐藏规则使问题复杂性陡然增加。规则如下:
1、如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
2、 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与重写混淆)。
说了这么多绕口令,恐怕不容易理解,看个简单的例子吧:
按照习惯性思维,觉得main函数中指针pb会调用父类的方法,其实不对,隐藏发生了作用啦,此处符合隐藏的的条件1,所以这里父方法被隐藏掉了,调用的子类的方法,由于参数类型不匹配,编译器直接报错!!
如果我们在开发中,完全可以通过编译,发现此类错误,及时的修正就无所谓了。但是可怕的是在面试中,对重写、重载、隐藏概念不太熟悉的话,就有可能出错。
其实这个例子,是本人几年前的面试时的一道面试题中的一部分(实际的题目还要复杂一些),当时对隐藏这个概念了解得不够,做错了,所以一直记忆犹新。此时拿出来,希望对需要参加面试的板油有些帮助。
我相信我们绝大多数人写代码时,为了程序的可读性与赶速度的原则,下意识的避开这些类似于脑筋急转弯的语法,尽量使用不同的函数名来区分基类与派生类的函数(当然,不能避开的时候也是非常多的)。
可是有时候,有些面试主考官总喜欢拿这三个概念去为难你,考察你的C++基础是否牢固。所以为了面试、这三个概念还是需要我们去区分一下。
说点个人比较偏激的观点:重载、重写是必须要知道,因为用途太广泛;至于隐藏吗,完全是C++为面试官设计的(^_^等待挨砖)。
1、重载的特征:在同一个类中;函数名字相同;参数不同;virtual 关键字可有可无。
2、重写(覆盖)特征是:分别位于派生类与基类;函数名字相同;参数相同;基类函数必须有virtual 关键字(这点非常要注意)。
2、隐藏
个人认为以上两点比较容易记得住,但是C++的隐藏规则使问题复杂性陡然增加。规则如下:
1、如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
2、 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与重写混淆)。
说了这么多绕口令,恐怕不容易理解,看个简单的例子吧:
class A{ public: void f(int a); }; class B: public A{ public: void f(char *p) }; void main(){ int i = 1; B b; A *pa = &b; B *pb = &b; pa->f(i);//调用父类A的方法; pb->f(i);//这里呢?调用的哪里的方法? };
按照习惯性思维,觉得main函数中指针pb会调用父类的方法,其实不对,隐藏发生了作用啦,此处符合隐藏的的条件1,所以这里父方法被隐藏掉了,调用的子类的方法,由于参数类型不匹配,编译器直接报错!!
如果我们在开发中,完全可以通过编译,发现此类错误,及时的修正就无所谓了。但是可怕的是在面试中,对重写、重载、隐藏概念不太熟悉的话,就有可能出错。
其实这个例子,是本人几年前的面试时的一道面试题中的一部分(实际的题目还要复杂一些),当时对隐藏这个概念了解得不够,做错了,所以一直记忆犹新。此时拿出来,希望对需要参加面试的板油有些帮助。
相关文章推荐
- 关于指针的三个容易弄混淆的概念及发散~~~
- 关于指针的三个容易弄混淆的概念及发散
- C++中的模板比较容易混淆的几个概念:类模板和类成员模板以及函数模板
- 关于指针的三个容易弄混淆的概念及发散~~~
- [C++基础]那些容易被混淆的概念:函数/数组指针-指针函数/数组,类/函数模板-模板类/函数
- C++中几个容易混淆的概念——函数的重载、覆盖和隐藏
- C++中的模板比较容易混淆的几个概念:类模板和类成员模板以及函数模板
- 三个容易混淆的概念(依赖倒置、 控制反转、 依赖注入)
- [C++基础]那些容易被混淆的概念:函数/数组指针-指针函数/数组,类/函数模板-模板类/函数
- c&c++容易混淆的概念
- C#)DataTable,DataView和DataGrid中一些容易混淆的概念
- XML数据库中几个容易混淆的概念
- C++学习笔记2——易混淆概念及易忽略知识点
- 机器学习上的一些容易混淆的概念
- SVN一些容易混淆的概念解释
- JS中容易混淆的概念。
- Oracle配置监听和连接,已经一些比较容易混淆的相关概念
- DataTable,DataView和DataGrid中一些容易混淆的概念
- DataTable,DataView和DataGrid中一些容易混淆的概念
- Oracle的体系结构与容易混淆的概念