免费注册 查看新帖 |

Chinaunix

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

why this is working fine [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-10 17:38 |只看该作者 |倒序浏览

  1. using namespace std;

  2. class B
  3. {
  4. public:
  5.     void show(){puts("class B");}
  6. };

  7. class D:public B
  8. {
  9. public:
  10.     void showDDD(){puts("class D");}
  11. };

  12. int main(int argc, char **argv)
  13. {
  14.     void* p = new B;
  15.     D* pd;
  16.     pd = (D*)p;
  17.     pd->showDDD();
  18.     return 0;
  19. }
复制代码

compiled by g++, the output is
class D

why?

论坛徽章:
0
2 [报告]
发表于 2007-07-10 17:54 |只看该作者
对象实例化的时候,成员函数(或地址)并不在对象实体内存中。sizeof应该是1,对齐应该是4。

呼叫D::showDDD的时候,
pd本身地址应该传给D::showDDD,应该是作为一个参数,即D::showDDD中的this指针,
这个应该是C++处理。

论坛徽章:
0
3 [报告]
发表于 2007-07-10 18:27 |只看该作者
这没有什么奇怪的
只是,这样做是非常不推荐的

原帖由 icw_zy 于 2007-7-10 17:38 发表


using namespace std;

class B
{
public:
    void show(){puts("class B");}
};

class D:public B
{
public:
    void showDDD(){puts("class D");}
};

int main(int argc, char **argv)
...

论坛徽章:
0
4 [报告]
发表于 2007-07-10 19:46 |只看该作者
假如CLASS D 中的ShowDDD中使用了 CLASS D 特有的类成员,程序就会挂掉了...

论坛徽章:
0
5 [报告]
发表于 2007-07-10 19:49 |只看该作者
这可不一定

原帖由 MingLin1231 于 2007-7-10 19:46 发表
假如CLASS D 中的ShowDDD中使用了 CLASS D 特有的类成员,程序就会挂掉了...

论坛徽章:
0
6 [报告]
发表于 2007-07-10 20:01 |只看该作者
原帖由 ypxing 于 2007-7-10 19:49 发表
这可不一定


你不要钻牛角尖,至少从语言的角度这样做是会出事的..

论坛徽章:
0
7 [报告]
发表于 2007-07-10 20:07 |只看该作者
怎么可能正常呢, showDDD应该在B中被声明为虚函数. 否则这种upcast在实际中没有任何意义

论坛徽章:
0
8 [报告]
发表于 2007-07-10 20:14 |只看该作者
showDDD不是虚函数,编译时是静态链接进去的

论坛徽章:
0
9 [报告]
发表于 2007-07-10 20:15 |只看该作者
我说应该, 如果是虚函数就是override而不是upcast了

论坛徽章:
0
10 [报告]
发表于 2007-07-10 21:32 |只看该作者
很多时候,是否更应该问问“why do it this way”,而非“why it works”。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP