| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2160 人关注过本帖
标题:强转指针导致虚函数表丢失?
只看楼主 加入收藏
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
函数表是全类共享一个,不是一个对象一个。所以才需要用 this 指针来获得当前调用函数的对象究竟是哪个。
另外这种实现方式也不是标准规定的,所以编译器可以自己发挥。

你自己也提了,正确的做法肯定是
A *a = &c

像你这样类型转换是有大问题的。考虑下面的代码:
程序代码:
class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};

int main()
{
    D d;
    A* pa = &d;

    return 0;
}

它是有语法错误。
但如果你试图用 void * 从中迂回,那么就可以避免语法错误。

继承,包括虚继承,编译器都会为类型做很多检查。也会为动态绑定做很多准备,众所周知,多态是基于类型。不是一个地址就能获取全部的信息。
强制转换就等干在告诉编译器“请按我的想法来做”。编译器虽然不知道你要做什么,但是还是会遵从你的指示。

我觉得你这应该是一种未定义的行为,和 ++a + ++a 之类的代码差不多。但我找了半天,也没在标准上找到相关的规定。不过问题挺有意思的,我以前也没怎么考虑过。
2012-02-28 02:09
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
哦。顺带一提,我刚才举的那个例子的问题,可以用虚继承解决。一般引入虚继承的时而都是举的这个例子。
不过我觉得  C++ 的这几个机制不是很有意义。实践普遍认为应该尽量减少多继承(甚至是严格禁止使用),因为它是万恶之源。
2012-02-28 02:15
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
这个你推你推荐看<精通MFC> 刘晓华 写的。
c++的地方 绝对可以解惑你这个问题。。

不管你怎么转换虚函数表是不可以复制。(类对象拷贝的时候)和他是一个类共享的。
每个类的前4个字节保存的虚函数表的地址。。

你可以取出来然后使用。。。。
那本书就写相当好。。


用心做一件事情就这么简单
2012-02-28 20:50
快速回复:强转指针导致虚函数表丢失?
数据加载中...
 
   



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

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