virtual 函数会动态绑定,而virtual函数的缺省參数值是静态绑定的。

用一个base类型的指针p去指向一个derived类对象。通过p调用虚函数时,会动态绑定到实际所指对象中的函数;用一个derived类型的指针p2指向一个derived对象,由p2调用函数时,直接就是调用的derived中的函数。其參数值也是derived类中函数相应的參数值。

#include <iostream>
using namespace std;
class A
{
public:
enum Color {red,green,blue};
A()
{
cout<<"Construct A"<<endl;
}
virtual void dodraw()
{
draw();
}
private:
virtual void draw(Color color=blue) const
{
cout<<"base draw:"<<color<<endl;
}
};
class B:public A
{
public:
B()
{
cout<<"Construct B"<<endl;
}
virtual void dodraw()
{
draw();
} private:
virtual void draw(Color color=red) const
{
cout<<"derived draw:"<<color<<endl;
}
};
int main()
{
B b;
A *p=&b;
B *p2=&b;
p->dodraw();
p2->dodraw();
return 0;
}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWlucWlhb2h1YQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

上面的程序中。在B类中都重写了A中的两个virtual函数。从而。通过p和p2调用dodraw函数,事实上都是调用的B中dodraw。而B中的dodraw函数调用B中draw函数,从而draw的实參就是B中的缺省实參:red

#include <iostream>
using namespace std;
class A
{
public:
enum Color {red,green,blue};
A()
{
cout<<"Construct A"<<endl;
}
virtual void dodraw()
{
draw();
}
private:
virtual void draw(Color color=blue) const
{
cout<<"base draw:"<<color<<endl;
}
};
class B:public A
{
public:
B()
{
cout<<"Construct B"<<endl;
} private:
virtual void draw(Color color=red) const
{
cout<<"derived draw:"<<color<<endl;
}
};
int main()
{
B b;
A *p=&b;
B *p2=&b;
p->dodraw();
p2->dodraw();
return 0;
}





上面的程序,B和A中dodraw函数都是来源于A中,由p和p2调用dodraw时。都是调用的A类中的dodraw函数,dodraw再调用draw函数时。会动态绑定到实际所指的对象B中的draw函数,这在执行期确定,但draw函数的缺省实參是静态绑定的,就是A类中的blue值,这在编译器就已经确定。所以,假设又一次定义继承而来的缺省參数值,会出现一种奇怪的现象:virtual函数用的derived类中的,而參数是用的base类中的。

effective C++中条款37:绝不又一次定义继承而来的缺省參数值的更多相关文章

  1. Effective C++ Item 37 绝不又一次定义继承而来的缺省參数值

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:绝对不要又一次而来的缺省參数值.由于缺省參数值都是静态绑定,而 virtual 函数 ...

  2. Effective C++:条款37:绝不又一次定义继承而来的缺省參数值

    因为又一次定义继承而来的non-virtual函数是不对的(见上一个条款),所以这个条款就将问题局限于:绝不又一次定义继承一个带有缺省參数值的virtual函数. (一) virtual函数是动态绑定 ...

  3. 《effective C++》:条款37——绝不重新定义继承而来的缺省参数值

    引子: 阿里的一道题: #include <IOSTREAM> using namespace std; class A{ public: ) { cout<<"a~ ...

  4. Effective C++ Item 36 绝不又一次定义继承而来的 non-virtual 函数

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:绝对不要又一次定义继承而来的 non-virtual 函数 --> Item 7 ...

  5. 条款37:绝不重新定义继承而来的缺省参数值(Never redefine a function's inherited default parameter value)

    NOTE: 1.绝不重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定的,而virtual 函数-----你唯一应该覆盖的东西----却是动态绑定的.

  6. Effective C++ 50条款

    条款1:尽量用const和inline而不用#define 以const 行使常量折叠,用inline 代替常用操作的宏定义,而且库里面有很多常用函数可用.当然不能抛弃宏,宏还是很有用滴.偶最近才发现 ...

  7. 从effective C++中窥探C++11特性

    这几天在看effective C++3rd,这本书算是比较经典的一本入门C++的书了.虽然年代比较久远书中讲的好多模式已经被的新特性取代了,但是从这些旧的模式中可以了解到一些C++新特性设计的初衷,也 ...

  8. 读书笔记_Effective_C++_条款三十七:绝不重新定义继承而来的缺省参数值

    先看下面的例子: enum MyColor { RED, GREEN, BLUE, }; class Shape { public: ; }; class Rectangle: public Shap ...

  9. Effective C++:条款39:明智而审慎地使用private继承

    (一) (1)private继承意味着"依据某物实现出".仅仅有实现部分被继承.接口部分应略去: (2)它仅仅在软件"实现"层面上有意义,在软件"设计 ...

随机推荐

  1. window.open()/剪切板ZeroClipboard

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 「HNOI2018」游戏

    「HNOI2018」游戏 解题思路 首先没有锁上的门可以缩点缩掉,然后对于一扇锁上的门,如果钥匙在左边,那么右边就永远不可能到达左边,同理如果钥匙在右边,左边就永远不可能到达右边. 然后考虑一个暴力的 ...

  3. [BZOJ5291][BJOI2018]链上二次求和(线段树)

    感觉自己做的麻烦了,但常数似乎不算差.(只是Luogu最慢的点不到2s本地要跑10+s) 感觉我的想法是最自然的,但不明白为什么网上似乎找不到这种做法.(不过当然所有的做法都是分类大讨论,而我的方法手 ...

  4. 【Dijkstra】POJ1062-昂贵的聘礼

    由于物品编号从1开始,我们假定0也是一个物品作为起点,它到其它物品的距离就是各个物品的原始价值.开始时,如果两种物品主人的等级限制M在规定范围以内,且j能用i替换,则将优惠价格视作从i到j的一条权值为 ...

  5. 20162307 课堂测试 hash

    20162307 课堂测试 hash 作业要求 利用除留余数法为下列关键字集合的存储设计hash函数,并画出分别用开放寻址法和拉链法解决冲突得到的空间存储状态(散列因子取0.75) 关键字集合:85, ...

  6. [BZOJ4237]稻草人/[JOISC2014]かかし

    [BZOJ4237]稻草人/[JOISC2014]かかし 题目大意: 平面上\(n(n\le2\times10^5)\)个点,若一个矩形各边与坐标轴平行,左下角和右上角都在\(n\)个点之中,且内部不 ...

  7. 【洛谷】3469:[POI2008]BLO-Blockade【割点统计size】

    P3469 [POI2008]BLO-Blockade 题意翻译 在Byteotia有n个城镇. 一些城镇之间由无向边连接. 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些).每 ...

  8. DOM-XML(解析与创建)

    /** * 读取(解析)xml文件 * @author Administrator * */ public class DOMRead { public static void main(String ...

  9. SEEprog Serial EEPROM programmer

    Features SEEprog is universal programmer of all types of serial EEPROMs in 8-pin package. SEEprog en ...

  10. VS中运行HTTP 无法注册URL

    参考资料 http://www.java123.net/detail/view-449670.html http://www.cnblogs.com/jiewei915/archive/2010/06 ...