免费注册 查看新帖 |

Chinaunix

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

[C++] 一道关于虚函数的笔试题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-27 15:25 |只看该作者 |倒序浏览
#include <stdio.h>

class A
{
public:
        virtual void test(){printf("A test\n");}
};
class B : public A
{
public:
        void func(){test();}
        virtual void test(){ printf("B test\n");}
};
class C : public B
{
public:
        virtual void test(){printf("C test\n");}
};
void main()
{
        C c;
        ((B *)(&c)) ->func();
        ((B)c).func();
}
为什么输出结果C test
                                   B test

论坛徽章:
0
2 [报告]
发表于 2007-10-27 15:35 |只看该作者
很明显啊, 这本来就是虚函数的性质嘛.
不过出题者也是典型的C/C++混用的.

论坛徽章:
27
处女座
日期:2016-04-18 14:00:4515-16赛季CBA联赛之福建
日期:2023-03-31 15:54:2315-16赛季CBA联赛之深圳
日期:2020-06-02 10:10:5015-16赛季CBA联赛之广夏
日期:2019-07-23 16:59:452016科比退役纪念章
日期:2019-06-26 16:59:1315-16赛季CBA联赛之天津
日期:2019-05-28 14:25:1915-16赛季CBA联赛之青岛
日期:2019-05-16 10:14:082016科比退役纪念章
日期:2019-01-11 14:44:062016科比退役纪念章
日期:2018-07-18 16:17:4015-16赛季CBA联赛之上海
日期:2017-08-22 18:18:5515-16赛季CBA联赛之江苏
日期:2017-08-04 17:00:4715-16赛季CBA联赛之佛山
日期:2017-02-20 18:21:13
3 [报告]
发表于 2007-10-27 17:26 |只看该作者
本来想告诉你的。。。
















可惜我也不太清楚。。。

论坛徽章:
0
4 [报告]
发表于 2007-10-27 17:41 |只看该作者
原帖由 scutan 于 2007-10-27 15:35 发表
很明显啊, 这本来就是虚函数的性质嘛.
不过出题者也是典型的C/C++混用的.

很明显的混用,而且,干嘛要这么出啊

论坛徽章:
0
5 [报告]
发表于 2007-10-27 20:37 |只看该作者
虚函数就是这么用的。通过基类的指针或引用。
不过实际中不这么用吧

论坛徽章:
0
6 [报告]
发表于 2007-10-28 17:20 |只看该作者

虚函数之预见

C++中虚函数是为了实现多态性的机制,其核心理念是基类指针可以访问子类定义的函数。
C c;                            -----定义了一个子类对象。
((B *)(&c)) ->func();    -----通过指针访问子类的函数。
((B)c).func();               -----并没有引用c的地址,而是类似.NET中的一个装箱过程,变成了
一个B的新对象。

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
7 [报告]
发表于 2007-10-29 11:28 |只看该作者
一直没有搞懂基类子对象!

论坛徽章:
0
8 [报告]
发表于 2007-10-29 12:52 |只看该作者
原帖由 fzbook 于 2007-10-28 17:20 发表
C++中虚函数是为了实现多态性的机制,其核心理念是基类指针可以访问子类定义的函数。
C c;                            -----定义了一个子类对象。
((B *)(&c)) ->func();    -----通过指针访问子类的函数。
((B)c).func();               -----并没有引用c的地址,而是类似.NET中的一个装箱过程,变成了
一个B的新对象。

还是没看明白

论坛徽章:
27
处女座
日期:2016-04-18 14:00:4515-16赛季CBA联赛之福建
日期:2023-03-31 15:54:2315-16赛季CBA联赛之深圳
日期:2020-06-02 10:10:5015-16赛季CBA联赛之广夏
日期:2019-07-23 16:59:452016科比退役纪念章
日期:2019-06-26 16:59:1315-16赛季CBA联赛之天津
日期:2019-05-28 14:25:1915-16赛季CBA联赛之青岛
日期:2019-05-16 10:14:082016科比退役纪念章
日期:2019-01-11 14:44:062016科比退役纪念章
日期:2018-07-18 16:17:4015-16赛季CBA联赛之上海
日期:2017-08-22 18:18:5515-16赛季CBA联赛之江苏
日期:2017-08-04 17:00:4715-16赛季CBA联赛之佛山
日期:2017-02-20 18:21:13
9 [报告]
发表于 2007-10-29 13:42 |只看该作者
原帖由 dinghwy 于 2007-10-29 12:52 发表

还是没看明白


只可意会,不可言传。。。

论坛徽章:
0
10 [报告]
发表于 2007-10-29 14:14 |只看该作者

  1. #include <stdio.h>

  2. class A
  3. {
  4. public:
  5.         virtual void test(){printf("A test\n");}
  6. };
  7. class B : public A
  8. {
  9. public:
  10.         void func(){test();}
  11.         virtual void test(){ printf("B test\n");}
  12. };
  13. class C : public B
  14. {
  15. public:
  16.         virtual void test(){printf("C test\n");}
  17. };
  18. int main()
  19. {
  20.         C c;

  21.         //((B *)(&c))->func();
  22.         C * pC = &c;
  23.         B * pTmp = (B *)pC;
  24.         printf( "&c: %p, (B *)&c: %p\n", pC, pTmp );
  25.         (&c)->func();
  26.         c.func();
  27.         pTmp->func();
  28.         (* pTmp).func();

  29.         //((B)c).func();
  30.         B insB = ((B)c);
  31.         B * pB = &insB;
  32.         printf( "&c: %p, &((B)c): %p\n", pC, pB );
  33.         insB.func();
  34.         (&insB)->func();
  35.         (* pB).func();
  36.         pB->func();
  37.         
  38.         return( 0 );
  39. }

复制代码


输出:

  1. &c: 0xbfe24a80, (B *)&c: 0xbfe24a80
  2. C test
  3. C test
  4. C test
  5. C test
  6. &c: 0xbfe24a80, &((B)c): 0xbfe24a60
  7. B test
  8. B test
  9. B test
  10. B test
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP