基类与派生类之间成员函数指针的一点疑问

wswqwps 2007-10-07 03:16:46
class B
{
public:
int x;
char y;
int a;

int get_a(){return a;}
};

class D:public B
{
public:

int b;

int get_b(){return b;}
};
int main()
{
B b;
D d;

int D::*pi2 = &B::a;//pi2 偏移量8
int B::*pi3 = &D::a;//pi3 偏移量8
//int B::*pi4 = &D::b; //impossible 12,in B there is no 12


b.*pi3;//偏移量在B内有效
d.*pi2;//两个偏移量在派生类内均有效

std::cout<<d.*pi3;//两个偏移量在派生类内均有效
b.*pi2;//?


?号那句编译错误:

error C2440: 'newline' : cannot convert from 'B *__w64 ' to 'D *__w64 ',Cast from base to derived requires dynamic_cast or static_cast

error C2647: '.*' : cannot dereference a 'int D::* ' on a 'B'

必知必会上说"存在从指向基类成员的指针到指向派生类成员的指针的隐式转换.反之不行" 我理解为派生类指针可以指向基类成员,反之不行,但编译器说从基类到派生类转换需要static_cast或dynamic_cast,不知何故?
...全文
132 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
LZHWWY 2007-10-08
  • 打赏
  • 举报
回复
基类指针指向派生类自然没问题,派生类指针指向基类也未尝不可,不过不提倡这么用,当派生类和基类的大小相等时(sizeof(base)==sizeof(devided)),派指向基不会出什么问题,不过要显示的转行,但一旦二者大小不等时,就会出现严重的问题:显示转换时,(devided*)&base时,你把base的空间扩大了,但大出来的部分没什么意义,反倒是给黑客们留下了机会。。。
wswqwps 2007-10-07
  • 打赏
  • 举报
回复
那么d.*pi3这句呢,pi3并不是d的指针,是不是中间发生了什么隐式转换?谢了。
cannot 2007-10-07
  • 打赏
  • 举报
回复
b.*pi2;这个有问题,其他的没问题
pi2是D的成员指针,不能不B类型的对象来解引用。。因为你没办法保证D的成员一定在B中存在。。
wswqwps 2007-10-07
  • 打赏
  • 举报
回复
汗,没有牛人来回复一下么???

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧