免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4512 | 回复: 12
打印 上一主题 下一主题

C++代码经过编译后,虚函数的默认参数值最后放到哪里去了? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-31 20:04 |只看该作者 |倒序浏览
有如下两个类的定义:
class A
{
public:
virtual void methd(int a =  9) {return a};
};
class B:A
{
public:
void methd(int a =10) {return a};
};

请问,如下代码输出结果是10还是9?
A *ptr = new B ;
B.methd();

为什么会出现这样的情况,其编译处理的过程是怎么样的?

论坛徽章:
0
2 [报告]
发表于 2010-08-31 20:32 |只看该作者
Effective C++:
Item 37: Never redefine a function's inherited default parameter value

论坛徽章:
0
3 [报告]
发表于 2010-08-31 20:37 |只看该作者
对,楼上说得很对,所谓默认参数,只是编译器的一个把戏而已,其实编译出来的代码是假设那里有参数的,虚函数是运行时的功能,所以我估计编译时只能看到编译时的东西,也就是说输出是9

论坛徽章:
0
4 [报告]
发表于 2010-08-31 20:52 |只看该作者
回insnowind :这个问题正是大家一起讨论effective c++ 37条是推出的问题。虽然知道结果,但是,是编译的时候是怎么一个处理过程,为什么会导致这样 ?

回morocco:我们也是同样的猜测。但是谁能给出明确的编译过程? 我是对编译过程不太了解哦。猜个大概的话,我想只是大众水平

期待高人!

论坛徽章:
0
5 [报告]
发表于 2010-08-31 21:14 |只看该作者
编译器替你填上了相关的参数。

在虚函数中使用默认参数,默认参数就是调用类型的默认参数,而不是实际类型的参数。

论坛徽章:
0
6 [报告]
发表于 2010-08-31 21:30 |只看该作者
本帖最后由 insnowind 于 2010-09-12 11:43 编辑

C++对于虚函数已经需要附加一个虚函数表来处理了,虚表中的指针在运行时动态调整指针的指向,从而确定每一个该调用的函数。如果对于默认参数也需要动态绑定,那么C++最起码需要至少再附加一个表来处理,这样如果有多个默认参数的函数,C++的对象会越来越大,这里为了简化处理,直接不管了,静态绑定,然后就根据函数指针来调用了。

论坛徽章:
0
7 [报告]
发表于 2010-08-31 21:35 |只看该作者
编译器具体的做法估计要看g++什么的源代码才能搞清楚。

论坛徽章:
0
8 [报告]
发表于 2010-08-31 21:39 |只看该作者
本帖最后由 xb_parasite 于 2010-08-31 21:40 编辑

什么是静态绑定?
为什么是代码段而不是数据段什么的呢?还有编译的时候到底什么东西放在数据段什么东西放在代码段。
虚表是一个类一个吗?

论坛徽章:
0
9 [报告]
发表于 2010-09-07 12:28 |只看该作者
回复 7# insnowind


   我正想看看编译器的源代码。不过有点畏惧。恐怕代码量很大。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
10 [报告]
发表于 2010-09-07 12:47 |只看该作者
默认参数被编译进每个调用点处, 跟是否虚函数没有关系。


  1. // 1.cpp
  2. extern int f(int x=12,int y=26);
  3. int f1()
  4. {
  5.       return f();
  6.       // push 26
  7.       // push 12
  8.       // call f
  9. }
复制代码

  1. // 2.cpp
  2. extern int f(int x=26, int y=12);
  3. int f2()
  4. {
  5.       return f();
  6.       // push 12
  7.       // push 26
  8.       // call f
  9. }
复制代码

  1. // f.cpp
  2. int f(int x,int y) { return x+y; }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP