| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 953 人关注过本帖
标题:关于指针类型强转,故意没分的,呵呵
只看楼主 加入收藏
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
结帖率:100%
收藏
 问题点数:0 回复次数:7 
关于指针类型强转,故意没分的,呵呵
程序代码:
#include "stdafx.h"
#include <iostream>

class A
{
public:
    A() {}
    virtual ~A() {}

public:
    virtual void Display() { std::cout << "A" << std::endl; }
};

class B : public A
{
public:
    B() : A() {}
    virtual ~B() {}

public:
    virtual void Display() { std::cout << "B" << std::endl; }
};

int main()
{
    B* b = new B();
    b->Display();

    UINT32 p = (UINT32)b;
    A* a = (A*)p;
    a->Display();

    char ch;
    std::cin >> ch;
}


我以为会是BA,结果输出是BB
我大概模模糊糊知道为什么,求专家详解


[ 本帖最后由 peach5460 于 2013-4-8 21:36 编辑 ]
2013-04-08 21:34
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
是BB啊

Display 是虚函数来的,A* a = (A*)p;实质上a干事一个B对象,通过虚函数表当然是输出 B了

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-04-08 21:47
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
UINT32 p = (UINT32)b;
     A* a = (A*)p

和 A *a = (A*)b 本质是一样的

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-04-08 21:47
oxeno
Rank: 2
等 级:论坛游民
威 望:1
帖 子:12
专家分:19
注 册:2013-4-8
收藏
得分:0 
我用typeid看了,b依然是B类型的指针,但是p就是UINT32 类型的指针, 就是说对p的强转没有效果....
至于为什么第二个是B.........还等赐教.
2013-04-08 22:00
oxeno
Rank: 2
等 级:论坛游民
威 望:1
帖 子:12
专家分:19
注 册:2013-4-8
收藏
得分:0 
回复 3楼 yuccn
请问为什么  UINT32的强转会没有效果的?
2013-04-08 22:01
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
呵呵,如果输出是BA,那么 c++的多态性就完全没有意义了。自己慢慢理解咯

“回复 3楼 yuccn
请问为什么  UINT32的强转会没有效果的? ”

你说的没有效果是什么意思?
UINT32 p = (UINT32)b;
      A* a = (A*)p
其实不就是地址的间接传递嘛,




我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-04-08 23:12
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:0 
我是这样理解的啊 不知道对不对啊
指针类型的强制转换或是隐式转换 与 实例对象之间的转换不同
对象之间的转换会发生截断 也就是改变了对象性质 而指针不同 不管你怎么样折腾 他的值 一个32位的地址是不会发生变化
所以 像楼主这样 一个B对象的指针不管怎样折腾后 最后事实上还是把那个无名对象实例的地址传给了基类指针
所以还是会发生多态的
A *a = &(A)*(A*)p;

像上面这样 就不会发生多态了 中间发生了对象的转换 运行出来就是 BA
不过这句话是错的 a指向了一个临时对象 但是代码比较简单 可能内存还没有被覆盖 所以还是可以运行的 仅供娱乐

人生是一场错过 愿你别蹉跎
2013-04-08 23:27
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
以下是引用yuccn在2013-4-8 23:12:55的发言:

呵呵,如果输出是BA,那么 c++的多态性就完全没有意义了。自己慢慢理解咯

“回复 3楼 yuccn
请问为什么  UINT32的强转会没有效果的? ”

你说的没有效果是什么意思?
UINT32 p = (UINT32)b;
      A* a = (A*)p
其实不就是地址的间接传递嘛,

其实我试了一下,大致知道是什么原理了,以前对指针的理解太肤浅了,呵呵
不过我现在很感兴趣指针把他的类型放在哪在

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-04-09 08:03
快速回复:关于指针类型强转,故意没分的,呵呵
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031078 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved