收录日期:2019/06/20 13:40:16 时间:2016/06/01 15:44:16 标签:C++ 语言
/*在阅读 <<高质量程序设计>> 中遇到的两个问题
15.2 成员函数的重载 覆盖 与隐藏 中的 一个问题?
我学C++不久, 才疏学浅. 
对于成员函数的重载 覆盖 与隐藏的理解是: 在被继承的子类中除非显式的声明, 否则子类只能调用本类的方法, 与父类毫无关系.
*/

#include <iostream.h>
class Base
{
public:
virtual void f(float x)  { cout << "Base::f(float) " << x << endl; }
void g(float x){ cout << "Base::g(float) " << x << endl; }
void h(float x){ cout << "Base::h(float) " << x << endl; }
};

class Derived : public Base
{
public:
virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }
void g(int x){ cout << "Derived::g(int) " << x << endl; }
void h(float x){ cout << "Derived::h(float) " << x << endl; }
};

void main(void)
{
Derived  d;  // 我理解为: 声明了一个子类对象, 向上造型生成pb, 自身实现pd

Base *pb = &d;
Derived *pd = &d;
// Good : behavior depends solely on type of the object

pb->f(3.14f); // Derived::f(float) 3.14  父类对象用子类的方法来实现? :(  这句话我想不通
pd->f(3.14f); // Derived::f(float) 3.14
// Bad : behavior depends on type of the pointer

cout<<endl;
pb->g(3.14f); // Base::g(float) 3.14  就是父类的对象
pd->g(3.14f); // Derived::g(int) 3    (surprise!)
// Bad : behavior depends on type of the pointer

cout<<endl;
pb->h(3.14f); // Base::h(float) 3.14  (surprise!)  就是父类的对象
pd->h(3.14f); // Derived::h(float) 3.14 
}
//15.2.3  摆脱隐藏

#include <iostream.h>
void output( int x);
void output( int x, float y=0.0);

void output( int x)  // 函数A
{
cout << " output int " << x << endl ;
}

void output( int x, float y)  // 函数B
{
cout << " output int " << x << " and float " << y << endl ;
}

void main(void)
{ int x=1;
float y=0.5;

//  output(x); // error! ambiguous call  (形参个数1个, 类型int)我认只可能匹配函数A, 与函数B扯不上任何关系, 为何产生了二义性 :(
output(x,y); // output int 1 and float 0.5
}
void output( int x);
void output( int x, float y=0.0);这个函数产生了一个问题。就是使用output(x);时不知道y是没有值,还是使用y=0.0。你应该改改output的定义。
void output( int x);
void output( int x, float y=0.0);

这两个在使用的时候 如果都是传入的int参数 output(3),编译器就不知道你是想要它调用哪一个函数
pb->f(3.14f); // Derived::f(float) 3.14  父类对象用子类的方法来实现? :(  这句话我想不通

f定义为虚函数 pb指向的是子类对象 动态绑定噢! 自然调用的就是子类的方法了

推荐你一本书哎!《inside the c++ object model》很爽的 很多很晕的东东看了它就懂了
有没有第二版的下载地址啊??

postgresql有没有类似oracel中exception得sqlcode或出错文字信息? 请问如何让SWF文件下载而不是在线播放?? 求hibernate开发列子 该怎么提高PHP水平呢 那个有《Java2应用开发指南》的光盘源码呀,我的光盘,丢了。谢谢好心人 奇怪的鼠标钩子问题,VC编写,VB调用 ========如何实现整个站点的文字搜索?========= 求助~~~刚装了个jbuider2006 在递归调用时如何使用SqlDataReader?? 大家谈谈:自己做一个gis平台的心得体会。我想做一个跨操作系统的gis平台,如何着手? 关于sqlserver登录名和用户名的问题 求一个存储过程 问个windows service的问题:“服务启动后又停止了,因为没什么可做” NTFS文件的访问 webfrom取pdf问题 问一下,类里面调试是怎么调试的,我急疯了,教教我好吗? 用户权限管理模块设计讨论? 高手帮忙:怎样实现商业软件中的grid的功能?--grid应用总结 请问怎么画图表示发送同步消息,等待返回的消息的不同再进行不同的处理啊? 求dotnetcharting使用范例! [算法]求教高手:如何将点调整为顺时针保存 控制两个输入框只能有一个可以进行操作 新手的疑惑,常识性问题,欢迎参与讨论 奇怪的鼠标钩子问题,VC编写,VB调用 (VC 版发贴了) 请问CSS大侠个问题:怎么实现这个功能? 求一个网页的列子,谢谢!!!! Eclipse FTP插件的问题 vb技术 特急:关于SESSION的值,哪里去了? 如何把asp.net设计环境的默认语言改成c#