当C++多继承遇上类型转换

本文介绍了C++中多继承遇到的类型转换问题及其解决思路。从问题的由来出发,详细分析了原型和问题所在,并提出了有效的解决方案,最后分享了一点关于多继承和类型转换的个人感悟。
摘要由CSDN通过智能技术生成

1 由来

客户用陈旧的VC++6.0进行项目开发,有一块功能需要我来实现。让一个早就习惯了VS2013的人去使用C++支持不太好的VC6去做开发实在是非常不爽,于是另辟蹊径,打算使用VC++2013开发编译出DLL,供VC6下调用即可。使用C++开发DLL的基本原则是减少暴露和接口简单化,最常用的方式就是使用纯虚类导出接口。另一种就是使用C++实现,但是导出时只导出C函数。处于使用的便利性考虑,采用了第一种方式。

2 原型与问题

基本的设计思路可以用如下代码描述。
#include <iostream>
#include <hash_map>
using namespace std;


class I1
{
public:
	virtual void vf1()
	{
		cout << "I'm I1:vf1()" << endl;
	}
};


class I2
{
public:
	virtual void vf2()
	{
		cout << "I'm I2:vf2()" << endl;
	}
};


class C : public I1, public I2
{
private:
	hash_map<string, string> m_cache;
};


I1* CreateC()
{
	return new C();
}


int main(int argc, char** argv)
{
	I1* pI1 = CreateC();
	pI1->vf1();


	I2* pI2 = (I2*)pI1;
	pI2->vf2();


	delete pI1;
	return 0;
}


采用基于接口的设计方法,对外只暴露接口类I1和I2,对于实际的实现类C则对外隐藏。客户在使用的时候,只需要调用CreateC()就可以产生C类型的对象,而不必知道C的实现细节。然后通过不同的接口调用不同方面的功能。看起来一切还可以,但实际运行却是有问题的,上述代码执行结果如下:


第二行的输出对应pI2->vf2(),显然结果是错误的,调用者的本意是调用I2::vf2(),实际却调用了I1::vf1()。随后我发现这个问题其实在论坛上也有人提出过,也有不少人给出了答案,但是感觉解释的不够明确和详细,所以决定亲自一探究竟。

3 分析

对于多继承下的内存布局问题,请参考本人的博文:http://blog.csdn.net/smstong/article/details/6604
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值