设为首页 加入收藏

TOP

C++多继承的类型转换中遇到的问题及解决办法
2017-11-07 08:56:19 】 浏览:254
Tags:继承 类型 转换 遇到 问题 解决 办法

今天在写代码时遇到这么一个问题,与多继承的类型转换相关。

公司现在开发一个系统,在公共段有对外接口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
  
   (cobject);
}
  

实现类CObjectEx和KObjectEx都会实现这个CreateGObject(),在内部调用时会将其动态转换成GObjectEx*,这样就出现了最开始说的转换失败的问题,因为这么做连CreateGObject返回的值都为NULL,更别提再将它转为GObjectEx。

我的解决方案:

将对外接口和对内接口分开,单独以CObjectEx为例,KObject和它类似:

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

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

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++ 11 nullptr关键字、C/C++中的.. 下一篇C++创建多级目录代码教程

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目