C++Primer-虚函数与默认实参
来源:互联网 发布:微博网络运营 编辑:程序博客网 时间:2024/04/27 17:25
像其他任何函数一样,虚函数也可以有默认实参。通常,如果有用在给定调用中的默认实参值,该值将在编译时确定。如果一个调用省略了默认值的实参,则所用的值由调用该函数的类型定义,与对象的动态类型无关。通过基类的引用或指针调用虚函数时,默认实参为在基类虚函数生命中定义的值,如果通过派生类的指针或者引用调用虚函数,则默认实参是在派生类的版本中声明的值。
在同一虚函数的基类版本和派生类版本中使用不同的默认实参几乎一定会引起麻烦。如果通过基类的引用或指针调用虚函数,但实际执行的是派生类中定义的版本,这时就可能会出现问题。在这种情况下,为虚函数的基类版本定义的默认实参将传给派生类定义的版本,而派生类版本是不同的默认实参定义的。
如果基类virtual函数中的默认实参和派生类中的默认实参不同,则一定会引起错误。原因在于这个值是在编译时确定,而且只与调用函数的类型有关,而和动态类型无关。也就是说,当动态绑定发生的时候,想要使用派生类中的默认实参,是使用的确实基类的!
#include <iostream>using namespace std;class A{public:virtual void out(int i = 10){cout << "class A " << i <<endl;}};class B : public A{public:void out(int i = 20){cout <<"class B " <<i <<endl;}};int main(){A * pa = new A();pa->out();pa->out(30);B * pb = new B();pb->out();pb->out(40);pa=pb;pa->out();pa->out(40);delete(pa);delete(pb);return 0;}
运行结果如下:
有上面的分析可知,当pa=pb后,pa->out()调用是函数B::out(),但是缺省参数是多少?
分析一下,缺省参数是静态绑定的,pa->out()时,pa的静态类型是A*,所以它的缺省参数应该是10。
对于这个特性,估计没有人会喜欢。所以,永远记住:
“绝不重新定义继承而来的缺省参数(Never redefine function’s inherited default parameters value.)”
0 0
- C++Primer-虚函数与默认实参
- 【c++primer——15】面向对象编程01——虚函数与默认实参
- 虚函数与默认实参
- 虚函数与默认实参
- 虚函数与默认实参
- 虚函数与默认实参
- 虚函数与默认实参
- 虚函数与默认实参
- 虚函数与默认实参
- 立此存照(25)[C++]虚函数与默认实参
- c++ 虚函数与默认实参
- [C++] 关于函数的默认实参
- 默认实参与显示实参
- C++虚函数的默认实参
- 函数默认实参
- 函数声明--默认实参
- 默认实参,constexpr函数
- 函数的默认实参
- VB.NET & Visual Basic
- C++宏笔记
- linux下字符集编码转换轻松实现
- DownUserImg
- 网络安全书籍介绍
- C++Primer-虚函数与默认实参
- 当年今日,10年前的文章啊,时间真是一把杀猪的刀(关于如何用Tomcat做图片服务)
- 书写优雅的shell脚本(插曲)- ed编辑器
- Android logcat保存当前应用程序的日志并上传服务器或指定邮箱
- SSD 从形式到实质之改变
- 设置edittext光标在左上
- Mahout 0.5部署
- matlab基础知识 randperm()的用法
- wpf 给window加背景图片