static_cast问题

lxdfigo 2010-06-01 05:34:07

class A
{
void print()
{
cout<<"A";
}
};
class B:B
{
int b;
void print()
{
cout<<"B";
}
};
int main()
{
A * a = new A;
B * b = static_cast<B*>(a);
b->print();
a->print();
b->b = 0;
cout<<b->b;

}


为什么b->print()输出的是B,而a->print()输出的是A,而且b->b=0;也没有报错?

如果把print改成虚函数则,a->print()与b->print()都输出的是A了??
...全文
175 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
maple_zhj 2010-06-02
  • 打赏
  • 举报
回复
强制转换后,调用的是 转换后的 类型的 函数。

而虚函数,则是 调用 动态绑定的 对象 中的 实际函数。
lxdfigo 2010-06-02
  • 打赏
  • 举报
回复
虚函数啊,RTTI啊我都知道机制,我想知道的是,static_cast转换后,的在内从中是什么样的?在编译期就分配了子类的空间?新构建了一个对象,然后把b指向它?
hawke1234 2010-06-02
  • 打赏
  • 举报
回复
static_cast, 类型强制转换,由于是下行转换,如果不强转,编译不过。
关于虚函数的问题,我觉得只要搞清楚类的内存结构,就不难理解了,所以推荐你看看这个http://blog.csdn.net/jimmy54/archive/2010/03/26/5418766.aspx,
herman~~ 2010-06-02
  • 打赏
  • 举报
回复
class B:public A//先纠正这个问题

另外你的print函数不是虚的,所以没有运行时动态特性
qq120848369 2010-06-01
  • 打赏
  • 举报
回复
高级,真不太懂.
lxdfigo 2010-06-01
  • 打赏
  • 举报
回复
b->b=0;我改成b->b=100;也可以运行啊? 关键是这个static_cast<B*>执行了什么操作? 内部机制是什么
pengzhixi 2010-06-01
  • 打赏
  • 举报
回复
class B:public A//先纠正这个问题

另外对于不访问函数成员的成员函数,你都可以这样用 (B*)0->print();
fanster28_ 2010-06-01
  • 打赏
  • 举报
回复
看下面的代码,首先函数调用并不依赖b的值,只与其型别有关
b是一个B*,调用print(),只需要在B的函数表中找到print()的地址并调用

至于b->b=0;
这个其实是访问越界了,解析时,给指针b的地址+成员b的偏移量开始的单元赋值
这个已经在a外面了

如果你把b=1(低地址空间被操作系统保护,不能写)
b->b=1;就会报错

要深入了解C++面向对象模型,可以看看Inside the C++ Object Model


A * a = new A;
int x;
B * b = (B*)(&x);
b->print();
a->print();
b->b = 0;
cout<<b->b;
B * c = 0;
c->print();

65,210

社区成员

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

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