带有虚拟基类的C++下播
C++ Downcasting with virtual base class
我已经用如下接口定义了我的项目:
class iA
class iB : virtual public iA
class iC : virtual public iA
当我现在实现接口时。。
class A : virtual public iA
class B : virtual public iB, public A
class C : virtual public iC, public A
多亏了虚拟,我才不受钻石继承问题的困扰。但现在,我想将指向iA的指针向下转换为类型a。
void func1(iA* a){
static_cast<A*>(a);
}
这是不可能的,因为虚拟继承自iA
。我可以删除类A
中的virtual
关键字,但这样我就会遇到钻石继承问题。我知道我可以使用dynamic_cast
将iA
转换为A
,但我真的不想这样做。
我不得不这样做的情况如下:接口iA定义了函数CCD_ 7。我在A
类中实现了这个函数。在函数内部,我需要A
的一些成员(它们不是iA
的成员),所以我必须将iA*
a强制转换为A*
。这个强制转换是安全的,因为我知道iA*
是A
类型的对象,因为使用的实现中存在A
、B
和C
(否则,函数doSomething()
永远不会在类A
中调用)。
这是一个糟糕的设计吗?如何改进此设计以避免dynamic_cast
的需要?
问候
在引入接口后,不能假设实现iA的类是a(它可能是[A0,A1,…an]中的任何一个)。
给你两个选择:
- 删除接口
- 使用dynamic_cast
相关文章:
- 尝试通过多个向量访问变量时,向量下标超出范围
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 在指针的帮助下,文本文件中单词的频率
- 在未初始化映射的情况下,将值插入到映射的映射中
- 为什么在保护模式下继承升级不起作用
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在全屏模式下(在OpenGL中)使背景透明
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 下播最佳实践(C++)
- 带有虚拟基类的C++下播
- iPhone在个人热点模式下未发送网络广播/多播
- C++中的下播模板typename对象