标题:求解释!谢谢啦
只看楼主
l2480035288
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2013-3-15
结帖率:73.33%
 问题点数:0 回复次数:2 
求解释!谢谢啦
#include<iostream>
using namespace std;
class GA{
public;
virtual int f(){retum l;}
};
class GB: public GA{
public;
virtual int f(){return 2;}
};
void show(GA g){cout<<g.f();}
void display(GA &g){cout<<g.f();}
int main(){
GA a: show(a); display(a);
GB b: show(b); display(b);
retum 0;
}




为什么答案运行时   1112
搜索更多相关主题的帖子: public return 
2013-07-03 11:06
雪狼MJ
Rank: 8Rank: 8
来 自:甘肃
等 级:蝙蝠侠
威 望:4
帖 子:267
专家分:853
注 册:2012-5-27
得分:0 
呵呵,这玩意涉及到了虚函数的特性,也就涉及到了C++的多态。

virtual的意义在于指示编译器,对这类函数采取迟后联编(动态绑定)的方法。

虚函数特性只对自定义它之后的派生类有效。
(运行到这里:GA a: show(a); display(a);会输出11)

当通过普通基类对象访问派生类对象时,只能访问到派生类中的基类子对象中的成员。


对于基类定义的虚函数,当且仅当通过基类指针或引用调用派生类对象时,才能实现多态性,访问到它们实际所指对象中的虚函数版本。
(GB b: display(b);解释了display(b)输出2)

关于show(b)这个调用,show函数的参数是GA a,所以这里传递的时候将b符合GA的保留,其余的丢弃,相当于就是一个GA,所以会输出1.


Edsger Dijkstra:算法+数据结构=程序
2013-07-03 13:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
为什么不拷贝粘贴代码,而是故意手工打个不能编译的代码?
2013-07-03 15:06



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-416563-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043929 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved