C++ 多继承的类型转换中遇到的问题(待续)

今天在写代码时遇到这么一个问题,与多继承的类型转换相关。
公司现在开发一个系统,在公共段有对外接口GObject,还有一个对内的接口GObjectEx继承自GObject。
我自己的工程有一个对外的接口CObject继承自GObject,实现类CObjectEx继承自GObjectEx和CObject。
类的继承关系如下:
图片1 继承关系

当我new了CObjectEx对象后,无法通过dynamic_cast将其直接转换成它的父类GObject,转换后对象为NULL。
但是当进行两次动态转换即先dynamic_cast成CObject,然后再dynamic_cast成GObject就可以获取到GObject的对象。
推测不能直接转换成功的原因是:
1、类型转换不能跨越分支。即:可以沿着一条线进行类型转换,但是当线有分支时,编译器不清楚应选择哪种路线进行类型转换(因为如果任意选择一条路线转换成父类后,在下文再转换成子类,就会造成困扰),因此返回NULL。
那么应该如何设计这个继承结构呢?
我觉得我们这么设计接口是没有问题的,问题出在我们没有将对外和对内的接口函数分开。
我们是这么设计接口函数的,单独以CObjectEx为例,KObjectEx和它类似:

CObjectEx* cobject = new CObjectEx();   //单例
extern "C" __declspec(dllexport) GObject* CreateGObject(){
    return dynamic_cast<GObject*>(cobject);
}

实现类CObjectEx和KObjectEx都会实现这个CreateGObject(),在内部调用时会将其动态转换成GObjectEx*,这样就出现了最开始说的转换失败的问题,因为这么做连CreateGObject返回的值都为NULL,更别提再将它转为GObjectEx。
我的解决方案:
将对外接口和对内接口分开,单独以CObjectEx为例,KObject和它类似:

CObjectEx* cobject = new CObjcetEx();    //单例
extern "C" __declspec(dllexport) GObject* CreateGObject(){
    return dynamic_cast<GObject*>(dynamic_cast<CObjcet*>(cobject));    //这样返回的GObject*就不为空了,只提供对外的接口函数
}
extern "C" __declspec(dllexport) GObjectEx* CreateGObjectEx(){
    return dynamic_cast<GObjectEx*>(cobject);    //这样返回的GObjectEx*也不为空了,而且对内操作不需要对外的接口函数
}

不知这么设计是否合适,还没有抽空研究C++多继承的类型转换的原理,今晚现将我暂时想到的解决办法记录下来,希望对此有所研究的朋友能够多多指点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值