游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1886|回复: 8

怎么感觉成员函数问题有些混乱了呢。

[复制链接]

10

主题

88

帖子

88

积分

注册会员

Rank: 2

积分
88
发表于 2006-2-12 02:53:00 | 显示全部楼层 |阅读模式
刚写了下看看。
class B和C都继承A。现在实例化C,然后用一个A成员函数指针指向B的成员函数(类型转换),然后用C的实例调用,于是相当于C的实例调用了B的成员函数。

弹出的对话框标题为"this is B::bfunc",内容却是C的private成员"ccc"。

  1. #include <windows.h>

  2. class A
  3. {
  4. private:
  5.         LPSTR s;
  6. public:
  7.         A(){s="aaa";}
  8.         void afunc()
  9.         {
  10.                 MessageBox(NULL,s,"this is A::afunc",MB_OK);
  11.         }
  12. };

  13. [color=#339900]/*B继承A*/[/color]
  14. class B:public A
  15. {
  16. private:
  17.         LPSTR s;
  18. public:
  19.         B():A(){s="bbb";}
  20.         void bfunc()
  21.         {
  22.                 MessageBox(NULL,s,"this is B::bfunc",MB_OK);
  23.         }
  24. };

  25. [color=#339900]/*C继承A*/[/color]
  26. class C:public A
  27. {
  28. private:
  29.         LPSTR s;
  30. public:
  31.         C():A(){s="ccc";}
  32.         void cfunc()
  33.         {
  34.                 MessageBox(NULL,s,"this is C::cfunc",MB_OK);
  35.         }
  36. };



  37. typedef void (A::*LPDELEGATEAFUNC)(void);

  38. [color=#339900]/*WinMain*/[/color]
  39. int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR CmdLine,int CmdShow)
  40. {
  41.         [color=#339900]/*实例化C*/[/color]
  42.         C* c=new C();
  43.         [color=#339900]/*A成员函数指针指向B的成员函数*/[/color]
  44.         LPDELEGATEAFUNC pf=(LPDELEGATEAFUNC)B::bfunc;
  45.         [color=#339900]/*用C的实例调用该函数*/[/color]
  46.         (c->*pf)();

  47. }[color=#339900]/*WinMain*/[/color]

复制代码

18

主题

579

帖子

583

积分

高级会员

Rank: 4

积分
583
发表于 2006-2-12 03:10:00 | 显示全部楼层

Re:怎么感觉成员函数问题有些混乱了呢。

无语了。。。你在干什么。。。。LPSTR s相对于this的偏移是一样的,所以你才能这样子。
还有B():A()这样你不觉得。。。
private:        LPSTR s;有必要吗?
protected不就得了?

10

主题

88

帖子

88

积分

注册会员

Rank: 2

积分
88
 楼主| 发表于 2006-2-12 03:13:00 | 显示全部楼层

Re:怎么感觉成员函数问题有些混乱了呢。

……我只是在测试。

10

主题

88

帖子

88

积分

注册会员

Rank: 2

积分
88
 楼主| 发表于 2006-2-12 03:15:00 | 显示全部楼层

Re:怎么感觉成员函数问题有些混乱了呢。

貌似写成as bs cs更好些,懒得改了,反正结果都是一样的。

38

主题

96

帖子

148

积分

注册会员

Rank: 2

积分
148
发表于 2006-2-14 09:41:00 | 显示全部楼层

Re:怎么感觉成员函数问题有些混乱了呢。

B::bfunc 所以 使用成员函数指针时要加 B:: 来修饰, 类继承不是动态邦定的,是静态邦定的.
所以 B::修饰只适用于编译期间. 而运行时间是 C::bfunc()

38

主题

96

帖子

148

积分

注册会员

Rank: 2

积分
148
发表于 2006-2-14 09:44:00 | 显示全部楼层

Re:怎么感觉成员函数问题有些混乱了呢。

最后这个C类 里面有一个B 和一个A,所以,拥有 afunc bfunc 所以存在一个 C::bfunc()

18

主题

279

帖子

279

积分

中级会员

Rank: 3Rank: 3

积分
279
QQ
发表于 2006-2-14 11:26:00 | 显示全部楼层

Re:怎么感觉成员函数问题有些混乱了呢。

再正常不过的情况了。

类B的对象内存布局为:
----------偏移起始
A::s
B::s
----------
类C的对象内存布局为:
----------偏移起始
A::s
C::s
----------

类的成员函数在使用成员变量时以偏移量引用。
B::bfunc中用到的s( B::s )的偏移量转换到C上时恰好对应 C::s。

10

主题

88

帖子

88

积分

注册会员

Rank: 2

积分
88
 楼主| 发表于 2006-2-14 14:38:00 | 显示全部楼层

Re:怎么感觉成员函数问题有些混乱了呢。

嗯,这个我知道,只是说这个不算bug的bug。

但是如果没有继承关系的成员函数指针,vc编译的时候完全可以通过,不过调用的时候就不对了。

这个是有继承关系的,编译和运行都可,但是也有潜在的危险(加入我C那个位置是个int,或者干脆什么都没有,就出错了)

那天忽然醒悟,自己原来写的很多代码都是有这种风险的,现在正修改中……

18

主题

279

帖子

279

积分

中级会员

Rank: 3Rank: 3

积分
279
QQ
发表于 2006-2-15 10:20:00 | 显示全部楼层

Re:怎么感觉成员函数问题有些混乱了呢。

在C++中指针退化(从B到A的转换)是安全的,但进化(从A到B或从A到C的转换)是没有任何安全性可言的。
所以C++它老爹告戒我们不要使用指针进化动作,除非1)确切知道是在有效继承链上移动,2)使用了RTTI等技术,3)故意要找点教训。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 10:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表