绝不重新定义继承而来的缺省参数值--from Effective c++ item 37

原创 2015年11月17日 23:20:37

重温Effective c++

Item 37,Never redefine a function's inherited default parameter value.


 虚函数的调用,以及VFP的实现机制,应该已经很清楚了。

虚函数通过动态绑定,在通过指针和引用调用的时候,通过实际指向的对象的虚函数列表得到要调用的函数的地址。


但是一直不清楚的是,如果派生类重新定义了虚函数默认参数,这种重新定义是没有效果的。


原因是,c++对函数的默认参数是通过静态绑定的,也就是说调用的时候,会根据指针的类型(而不是指针指向的对象的类型)取得静态绑定的参数。



#include<string>
#include<list>
#include<iostream>
//#include<boost/shared_ptr.hpp>
#include<math.h>

using namespace std;
class Base
{
	public:
		virtual void print(string val="Base")
		{
			cout<<"this is class base print "<<val<<endl;	
		}
};

class Derive:public Base
{
	public:
		virtual void print(string val="Derive")
		{
			cout<<"this is class derive print "<<val<<endl;
		}
};




int main()
{
 Base *p=new Derive();
 p->print(); 
 return 0;
}

输出结果:

AlexdeMacBook-Pro:~ alex$ a.out
this is class derive print Base


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

《Effective C++》读书笔记之item37:绝不重新定义继承而来的缺省参数值

1.绝不重新定义继承而来的缺省参数值,它有两层意思: (1)如果函数是非虚函数,你根本不应该重新定义它,因此也谈不上改变缺省参数值了。(2)如果函数是虚函数,由于缺省参数值是“静态绑定”,即使使...

《Effective C++ 》学习笔记-第六章 条款37:绝不重新定义继承而来的缺省参数值

Never redefine a function's inherited default parameter value

Effective C++条款 37:绝不重新定义继承而来的缺省参数值

重新定义一个继承而来的non-virtual函数永远都是错误的,本条款的讨论限制在“带有缺省参数的virtual函数”。 virtual函数是动态绑定的,而缺省参数却是静态绑定。对象的所谓静态类型,...

C++之绝不重新定义继承而来的缺省参数值(37)---《Effective C++》

条款37:绝不重新定义继承而来的缺省参数值首先让我们进行分析,类的继承中只能继承两种函数,virtual和non-virtual,然鹅重新定义一个继承而来的non-virtual函数永远是错误的,所以...

Effective C++:绝不重新定义继承而来的缺省参数值

考虑下面这段程序: #include using namespace std; class Shape { public: enum ShapeColor { Red, Green, B...

关于C++虚函数默认参数的问题。Effective C++ 条款38: 决不要重新定义继承而来的缺省参数值

昨晚在chgaowei的博客上关于讨论C++虚函数的默认参数问题,刚翻书找了一下,在Effective C++ 中的38条有说明。直接上原文吧,最后加几句细点的理解条款38: 决不要重新定义继承而来的...

绝不重新定义继承而来的缺省参数值

重新定义一个继承而来的non-virtual函数永远都是错误的,本条款的讨论限制在“带有缺省参数的virtual函数”。 virtual函数是动态绑定的,而缺省参数却是静态绑定。对象的所谓静态类型,...

条款37:绝不重新定义继承而来的缺省参数

先上代码: class Base { public: virtual int getVal(int i = 0) { cout

绝不重新定义继承而来的缺省参数——effective c++学习笔记

绝不重新定义继承而来的缺省参数(Never redefine function’s inherited default parameters value.) 讨论的前提是:不重新定义继承而来的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:绝不重新定义继承而来的缺省参数值--from Effective c++ item 37
举报原因:
原因补充:

(最多只允许输入30个字)