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. 2333: [SCOI2011]棘手的操作[我不玩了]

    2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1979  Solved: 772[Submit][Stat ...

  2. DP Training(Updating)

    感觉前面做了那么多$dp$全是自己想的还是太少啊…… 好像在LZT的博客上看到了不错的资源?赶紧开坑,以一句话题解为主 Codeforces 419B 第一题就开始盗图 由于只有一个交点,手玩一下发现 ...

  3. OpenGL ES 3.0 帧缓冲区对象基础知识

    最近在帧缓冲区对象这里卡了一下,不过前面已经了解了相关的OpenGL ES的知识,现在再去了解就感觉轻松多了.现在就进行总结. 基础知识 我们知道,在应用程序调用任何的OpenGL ES命令之前,需要 ...

  4. w​x​F​o​r​m​B​u​i​l​d​e​r​初​体​验

    第一步 打开wxFormBuilder 修改工程信息并保存工程 Name: 工程名 File: 生成代码(.py)文件名 Code_generation: 生成代码类型 第二步 创建窗体 切换至for ...

  5. Codeforces Round #287 (Div. 2) A. Amr and Music 水题

    A. Amr and Music time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  6. hierarchyid有关的一些函数

    于hierarchyid有关的一些函数主要有:    GetAncestor :取得某一个级别的祖先    GetDescendant :取得某一个级别的子代    GetLevel :取得级别    ...

  7. JS实现背景透明度可变,文字不透明的效果

    最近项目里需要实现这么个功能,类似网游中的聊天框,背景都是透明的,但是文字是不透明.所以如果简单的使用opacity(非IE)和alpha滤镜(IE)是无法实现这个效果的,会造成全部透明. 解决办法如 ...

  8. Duplicate Elimination in Scrapy(转)

    之前介绍 Scrapy 的时候提过 Spider Trap ,实际上,就算是正常的网络拓扑,也是很复杂的相互链接,虽然我当时给的那个例子对于我感兴趣的内容是可以有一个线性顺序依次爬下来的,但是这样的情 ...

  9. HDU 4718 The LCIS on the Tree (动态树LCT)

    The LCIS on the Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Oth ...

  10. Android File Hierarchy : System Structure Architecture Layout

    Most of the Android user are using their Android phone just for calls, SMS, browsing and basic apps, ...