绝不重新定义继承而来的缺省参数值--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++》37: 绝不重新定义继承而来的缺省的参数值

《Effective C++》Rule 37: 绝不重新定义继承而来的缺省的参数值
  • yanglingwell
  • yanglingwell
  • 2016年02月28日 10:56
  • 3993

《Effective C++》36:绝不重新定义继承而来的non-virtual函数

《Effective C++》Rule36:绝不重新定义继承而来的non-virtual函数
  • yanglingwell
  • yanglingwell
  • 2016年02月27日 11:29
  • 3925

C++基础:缺省构造函数

缺省构造函数是C++以及其他的一些面向对象的程序设计语言中,
  • zhangyalin1992
  • zhangyalin1992
  • 2014年05月10日 16:01
  • 4745

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

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

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

由于重新定义继承而来的non-virtual函数是不正确的(见上一个条款),所以这个条款就将问题局限于:绝不重新定义继承一个带有缺省参数值的virtual函数。 (一) virtual函数是动态绑...
  • u010470972
  • u010470972
  • 2014年07月03日 16:55
  • 634

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

Never redefine a function's inherited default parameter value
  • shuideyidi
  • shuideyidi
  • 2014年08月03日 18:33
  • 790

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

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

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

virtual 函数会动态绑定,而virtual函数的缺省参数值是静态绑定的。用一个base类型的指针p去指向一个derived类对象,通过p调用虚函数时,会动态绑定到实际所指对象中的函数;用一个de...
  • yinqiaohua
  • yinqiaohua
  • 2015年06月25日 11:10
  • 571

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

virtual函数系动态绑定,而缺省参数值却是静态绑定。
  • u014558668
  • u014558668
  • 2017年05月28日 16:26
  • 98

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

条款37:绝不重新定义继承而来的缺省参数值首先让我们进行分析,类的继承中只能继承两种函数,virtual和non-virtual,然鹅重新定义一个继承而来的non-virtual函数永远是错误的,所以...
  • u014038273
  • u014038273
  • 2017年08月02日 16:00
  • 141
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:绝不重新定义继承而来的缺省参数值--from Effective c++ item 37
举报原因:
原因补充:

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