我正在尝试在一个大型库中编写一些类的子类。我得到一个“模糊的基础”错误。以下是该问题的可编辑示例:
#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'的模糊基础。
在这种情况下我能做些什么吗?
答案 0 :(得分:17)
你的问题是Interactor样式被继承两次 - 一次是PointSelector2D,一次是InteractorStyleCamera。这意味着您的班级中包含每个成员的2个版本。
退房:
How can I avoid the Diamond of Death when using multiple inheritance?
尝试虚拟继承。
答案 1 :(得分:5)
你可以通过使用两步演员表面“修复”它。例如
static_cast<PointSelector2D *>(static_cast<InteractorStyleCamera *>(o));
当然,您必须记住这会“修复”语法,但不会解决潜在的结构问题。您的PointSelector2D
里面有两个InteractorStyle
个基础子对象。根据您启动的InteractorStyle
个基础子对象,不同的向上路径是不同的。采取正确的道路非常重要。我上面写的是InteractorStyle
InteractorStyleCamera
。对于另一个基地,正确的向上播放将是
static_cast<PointSelector2D *>(static_cast<PointSelector *>(o));
如果您刚刚获得一个InteractorStyle *
指针而没有关于它指向哪个基础的额外信息,那么您无法用static_cast
解决问题。没有办法知道要采取哪种向上的路径。采取错误的结果会产生毫无意义的结果。
正如已经指出的那样,dynamic_cast
可以在这种情况下提供帮助,但它有其他要求(多态启动类型)。您的类型不是多态的(至少在您引用的示例中),因此dynamic_cast
不会接受它们用于向上播放。
答案 2 :(得分:3)
我相信您可以使用dynamic_cast
代替static_cast
来解决此问题。 dynamic_cast
可以在运行时查看对象,以确定指向哪两个InteractorStyle
基类,并从那里将指针调整为适当的类型。
答案 3 :(得分:0)
您可以通过将InteractorStyle
添加到PointSelector2D
继承的类中来编译您的代码(我得到了至少编译的示例)。我不知道这是否是一个长期解决方案。