具有多重继承的模糊基
Ambiguous base with multiple inheritance
我正试图在一个大库中编写类的一些子类。我得到了一个"模糊的基数"错误。下面是该问题的一个可编译示例:
#include <iostream>
// I can't change these because they are in the library:
class InteractorStyle {};
class InteractorStyleCamera : public InteractorStyle {};
class InteractorStyleImage : public InteractorStyle {};
// These are my subclasses (so I can change them):
class PointSelector : public InteractorStyle {};
class PointSelector2D : public InteractorStyleCamera, public PointSelector
{
// This function has to exist exactly like this (a requirement of the library):
static PointSelector2D* SafeDownCast(InteractorStyle *o)
{
return static_cast<PointSelector2D *>(o);
}
};
int main()
{
return 0;
}
错误是
在这种情况下我能做些什么吗?错误:' InteractorStyle '是' PointSelector2D '的模糊基。
你的问题是交互器样式被继承了两次-一次是PointSelector2D,一次是InteractorStyleCamera。这意味着在你的类中包含了它的每个成员的两个版本。
查看:
使用多重继承时如何避免死亡之钻?
尝试虚拟继承
您可以通过使用两步强制转换来表面上"修复"它。例如
static_cast<PointSelector2D *>(static_cast<InteractorStyleCamera *>(o));
当然,您必须记住,这"修复"了语法,但并没有修复潜在的结构问题。你的PointSelector2D
有两个InteractorStyle
基子对象在里面。根据从哪个InteractorStyle
基子对象开始,上行路径是不同的。选择正确的道路是非常重要的。我上面写的是InteractorStyleCamera
里面的InteractorStyle
。对于另一个碱基,正确的上转换应该是
static_cast<PointSelector2D *>(static_cast<PointSelector *>(o));
如果你只是给出一个InteractorStyle *
指针,没有关于它指向哪个基的额外信息,那么你不可能用static_cast
解决你的问题。没有办法知道该走哪条向上的路。选错了会产生完全没有意义的结果。
正如已经注意到的,dynamic_cast
可以在这种情况下提供帮助,但它有额外的要求(多态起始类型)。您的类型不是多态的(至少在您引用的示例中),因此dynamic_cast
将不接受它们进行向上转换。
我相信你可以通过使用dynamic_cast
而不是static_cast
来解决这个问题。dynamic_cast
可以在运行时查看对象,以确定指向两个InteractorStyle
基类中的哪一个,并从那里将指针向下调整为适当的类型。
您可以通过将InteractorStyle
添加到PointSelector2D
继承的类中来编译代码(我至少编译了您的示例)。我不知道这是否是一个长期的解决方案。
- 关于C++中具有多重继承"this"指针的说明
- C++中模板化异常类的多重继承
- 虚拟继承中是否存在多重继承?
- 如何在 c++ 多重继承中调用父非虚函数?
- 多重继承相同的方法名,没有歧义
- 使用enable_if解决多重继承歧义
- 多重继承导致虚假的模糊虚拟函数过载
- 多重继承和访问不明确的元素
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 多重继承中的派生类的行为类似于聚合
- 为什么我的 Hippomock 期望在使用多重继承时失败
- 带有此指针的模板类多重继承构造函数不起作用?
- 使用多重继承时出现编译错误
- 增强多重继承的序列化
- 多重继承:跳过'virtual'关键字并拒绝菱形层次结构的使用?
- 仅函数的多重继承 - 没有虚拟和 CRTP
- C++多重继承和鸭子类型
- C++两次从文件保存对象读取多重继承
- 从多重继承中的派生类函数调用适当的父类函数
- 具有多重继承的模糊基