c++编程思想中的例子,谁能帮我解释下?

蓝鹰 2012-06-10 07:44:23

//---------------------------------------------------------------------------

#pragma hdrstop

#include<iostream.h>
//using namespace std;
enum note{middleC,Csharp,Cflat};

class instrument
{
public:
virtual void play(note) const
{
cout<<"instrument::play"<<endl;
}
virtual char* what() const
{
return "instrument";
}
virtual void adjust(int){}
};

//Wind objects are instruments
//because they have the same interface:
class wind:public instrument
{
public:
//redefine interface fuction:
void play(note) const
{
cout<<"wind::play"<<endl;
}
char* what() const{ return "wind";}
void adjust(int){}
};

class percussion:public instrument{
public:
void play(note)const
{
cout<<"percussion::play"<<endl;
}
char * what() const{return "percussion";}
void adjust(int){}
};

class String:public instrument
{
public:
void play(note) const
{
cout<<"string::play"<<endl;
}
char* what() const{return "string";}
void adjust(int){}
};

class brass:public wind
{
public:
void play(note)const
{
cout<<"brass::play"<<endl;
}
char* what()const{return "brass";}
};

class woodwind:public wind
{
public:
void play(note) const
{
cout<<"woodwind::play"<<endl;
}
char* what() const{return "woodwind";}
};

//Identical function from before:
void tune(instrument& i)
{
i.play(middleC);
}

void f(instrument& i){i.adjust(1);}

//Upcasting during array initialization
instrument* A[]={
new wind,
new percussion,
new String,
new brass
};

//---------------------------------------------------------------------------

#pragma argsused
int main()
{
wind flute;
percussion drum;
String violin;
brass flugelhorn;
woodwind recorder;
tune(flute);
tune(drum);
tune(violin);
tune(flugelhorn);
tune(recorder);
f(flugelhorn);
system("pause");
}
//---------------------------------------------------------------------------



代码中的那个instrument指针数组究竟起个什么作用?书上原话是这样的:“数组A [ ]存放指向基类instrument 的指针,所以在数组初始化过程中发生向上映射。”
...全文
190 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝鹰 2012-06-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 10 楼 的回复:

引用 9 楼 的回复:

A完全没引用,怎么可能链接不过

A的作用就是保存派生类对象的基类型指针


我想也是这样,不知道你们用c++builder2010的感觉如何,


没用过…………linux的程序人生只用vim足矣……
[/Quote]windows
yangkai7758 2012-06-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 9 楼 的回复:

A完全没引用,怎么可能链接不过

A的作用就是保存派生类对象的基类型指针


我想也是这样,不知道你们用c++builder2010的感觉如何,
[/Quote]

没用过…………linux的程序人生只用vim足矣……
蓝鹰 2012-06-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

A完全没引用,怎么可能链接不过

A的作用就是保存派生类对象的基类型指针
[/Quote]

我想也是这样,不知道你们用c++builder2010的感觉如何,
yangkai7758 2012-06-11
  • 打赏
  • 举报
回复
A完全没引用,怎么可能链接不过

A的作用就是保存派生类对象的基类型指针
蓝鹰 2012-06-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 3 楼 的回复:

引用 2 楼 的回复:

向上映射指派生类指针赋值给基类的变量-->向上映射指派生类指针赋值给基类指针类型的变量

枚举note不用管。那我就实在不明白A都干了些什么了,似乎没有用。但是我若注释掉A的这段代码,编译器会报link错误,A似乎对函数f有什么影响,因为我将两个都注释掉的话就不报错了。

用 g++-4.7.0 试了一下,只注释掉 A 没有……
[/Quote]我是在csdn下的下的pdf文件,而且没有前言和封面。china—pub.com的是第14章的278页
pathuang68 2012-06-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
C/C++ code

//---------------------------------------------------------------------------

#pragma hdrstop

#include<iostream.h>
//using namespace std;
enum note{middleC,Csharp,Cflat};

class instrum……
[/Quote]

对这本书译者的水平表示怀疑,建议楼主看原版吧。

“数组A [ ]存放指向基类instrument 的指针,所以在数组初始化过程中发生向上映射。”应该是“向上转型(upcast)”。不会是邱仲潘这厮翻译的吧,如果是,建议楼主果断将这本书扔掉,否则你一定会怀疑自己的IQ有问题。

将派生类指针转型为基类指针,称为向上转型。向上转型总是安全的。
反之就是向下转型,向下转型未必安全。
ri_aje 2012-06-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:

向上映射指派生类指针赋值给基类的变量-->向上映射指派生类指针赋值给基类指针类型的变量

枚举note不用管。那我就实在不明白A都干了些什么了,似乎没有用。但是我若注释掉A的这段代码,编译器会报link错误,A似乎对函数f有什么影响,因为我将两个都注释掉的话就不报错了。
[/Quote]
用 g++-4.7.0 试了一下,只注释掉 A 没有影响,实际上也不应该有影响。你这个例子是那个版本那页的?
W170532934 2012-06-10
  • 打赏
  • 举报
回复
没有看过这书,等大牛来解释
蓝鹰 2012-06-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

向上映射指派生类指针赋值给基类的变量-->向上映射指派生类指针赋值给基类指针类型的变量
[/Quote]代码是完整的
蓝鹰 2012-06-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

向上映射指派生类指针赋值给基类的变量-->向上映射指派生类指针赋值给基类指针类型的变量
[/Quote]
枚举note不用管。那我就实在不明白A都干了些什么了,似乎没有用。但是我若注释掉A的这段代码,编译器会报link错误,A似乎对函数f有什么影响,因为我将两个都注释掉的话就不报错了。
彭家老三 2012-06-10
  • 打赏
  • 举报
回复
向上映射指派生类指针赋值给基类的变量-->向上映射指派生类指针赋值给基类指针类型的变量
彭家老三 2012-06-10
  • 打赏
  • 举报
回复
代码不完整还是咋回事?貌似note和A都没有啥用啊?

向上映射指派生类指针赋值给基类的变量,也就是基类类型的指针指向了派生类类型的对
象所占的内存空间,那么,很显然,可以保证基类类型指针的可访问范围都是有效,所以这种“向上映
射”是绝对安全的(所谓“向上”是指类层次的上下关系,基类在上,派生类在下)。

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧