一些C++虚函数重载的小问题
来源:互联网 发布:淘宝和京东哪个好 编辑:程序博客网 时间:2024/06/08 07:47
今天又看了一下C++面向对象部分,发现有一些之前没注意到关于虚函数的问题。
先定义基类和派生类
#include <iostream>using namespace std;class A{public:virtual void call(){cout<<"in A"<<endl;}};class B:public A{public:void call(){cout<<"in B"<<endl;}};int main(){A *test=new B();test->call();delete test;system("pause");return 0;}
动态绑定下调用虚函数,基类的函数被覆盖。结果是“in B”
当我们为派生类的同名函数加一个缺省值时
#include <iostream>using namespace std;class A{public:virtual void call(){cout<<"in A"<<endl;}};class B:public A{public:void call(const int a=1){cout<<"in B"<<endl;}};int main(){A *test=new B();test->call();delete test;system("pause");return 0;}
打印出来的结果还是"in A",看上去貌似B的call并没有覆盖基类所定义的虚函数
其实,在B类中,有两个名为call的函数,一是从基类中继承的call的虚函数,类又定义了自己的名为call的函数,接受一个int形参。但是实际上B中的call已经屏蔽了基类的同名函数,但是在B中并没有重定义无参数的虚函数版本,所以通过函数调用仍然调用A中的版本。
再看一个例子
#include <iostream>using namespace std;class A{public:virtual void call(const int a=1){cout<<a<<endl;}};class B:public A{public:void call(const int a=2){cout<<a<<endl;}};int main(){A *test=new B();test->call();delete test;system("pause");return 0;}这次在两个函数中,形参都一样但是默认缺省值却不一样,结果输出是 1
在虚函数中,默认参数的值是静态绑定的
其实程序调用的并不是A版本的call函数而是B版本的call函数,但是函数上所绑定的默认值是静态绑定,默认参数的缺省值与左边定义指针类型的静态类型有关
0 0
- 一些C++虚函数重载的小问题
- 函数重载的一个小问题
- java学习之重载(一些值得注意的小问题)
- C语言重载宏函数的小技巧
- 一些C语言的小问题
- 【C++】C++语法的一些小问题
- 【C++】函数的重载
- 【c++】函数的重载
- 函数重载的问题
- 虚函数重载的相关问题
- C语言一些小问题
- [C++]C++的函数重载
- 【c#】函数重载的条件
- c函数重载的实现
- C++ 函数重载的问题
- 重载函数的继承问题
- 构造函数的重载问题
- js函数重载的问题
- 程序员的自我修养 - 三种程序注释的比较
- C语言语句的组成
- Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解)
- ArcGIS 10.1 for Server 集群(RHEL)安装配置
- 设计模式学习之代理模式
- 一些C++虚函数重载的小问题
- java-spring文件配置sessionFactory及相关数据源示例代码
- CDT开发环境配置(MacOSX 10.9)
- IOS 很不错的的博客,有空多看看吧
- shell——终端打印
- MySQL索引-Hash索引与B-Tree索引 介绍及区别
- 黑马程序员之Java--正则表达式
- 题目1115:数字求和
- tomcat配置环境变量后在cmd中输入startup出现the JRE_HOME environment variable is not defined correctly This environ