C++多重继承与void*指针转换问题
来源:互联网 发布:mac的flash怎么更新 编辑:程序博客网 时间:2024/04/28 01:20
C++支持多重继承,然而多重继承可能会导致一些奇怪的问题,我前段时间遇到一个指针转换问题,非常典型。
先看一个简单的测试代码:
#include <iostream>using namespace std;class IA {public: virtual ~IA(){} virtual void a() = 0;};class IB{public: virtual ~IB(){} virtual void b() = 0;};class CMulti : public IA, public IB{public: CMulti(){} ~CMulti(){} void a(){ cout << "C::a()" << endl; } void b(){ cout << "C::b()" << endl; }};void testCastA(void *p){ cout << "cast from void*(" << p << ")to IA*: "; IA *a = (IA *)p; a->a();}void testCastB(void *p){ cout << "cast from void*(" << p << ")to IB*: "; IB *b = (IB *)p; b->b();}int _tmain(int argc, _TCHAR* argv[]){ CMulti * c = new CMulti; cout << "cast to void*, then to IA or IB:" << endl; testCastA((void*)c); testCastB((void*)c); cout << endl; cout << "static_cast to void*, then to IA or IB:" << endl; testCastA((void*)static_cast<IA*>(c)); testCastB((void*)static_cast<IB*>(c)); cout << endl; cout << "dynamic_cast to void*, then to IA or IB:" << endl; testCastA((void*)dynamic_cast<IA*>(c)); testCastB((void*)dynamic_cast<IB*>(c)); return 0;}
我测试了:
- 强制转换为void*
- 先static_cast再强制转换为void*
- 先dynamic_cast再强制转换为void*
(32位程序)运行的结果如下图所示:
差异很明显了,结论也很明了:多重继承时,子类指针转换为非第一继承的父类指针时,会发生地址偏移(注意图上标红的部分)。这是因为每一个父类都会占用 4 个字节维护自己的虚函数表。所以,当 CMulti* 转换为 IB* 时,指针加 4 ,因为 IA 是 CMulti 的第一父类, IB 是第二父类,依次类推……
如果我们在某些地方不得不使用 void* 来进行代码适配时,遇到多重继承就要注意这一点,否则很可能你调用的是 b() 方法,实际执行的是 a() ,达不到预期效果。
2 0
- C++多重继承与void*指针转换问题
- 多重继承与void*指针转换问题的分析
- C++:在多重继承时的指针转换问题
- C++多重继承下的指针类型转换
- C++-指针与void*指针
- 多重继承时的指针转换偏移
- 多重继承时的指针转换偏移
- 多重继承与类型转换 -- 虚基类多继承
- C++多重继承的指针问题
- C++在多重继承下的指针类型强制类型转换的一些问题
- 浅谈void指针的类型转换问题
- void与void*指针
- c++基类与继承类指针转换问题
- C语言之void 指针问题
- C++多重继承下的指针类型转换
- C++多重继承下的指针类型转换
- C++多重继承下的指针类型转换 图解
- C++多重继承下的指针类型转换
- java 基础记录
- tableView:cellForRowAtIndexPath:
- Mac下安装Lua。
- android之canvas.draw方法需要注意的地方
- BLE-NRF51822教程11-手机动态修改设备名
- C++多重继承与void*指针转换问题
- 聚类算法——K-means(上)
- IOS网络图片缓存详解
- Android studio 导出jar包并混淆和aar
- driver register到bus时候,是如何attach到匹配的device???
- 聚类算法——K-means(下)
- Linux删除文件和文件夹【命令】
- JAVA fail-fast机制
- javascript 美术馆--改进1