具有多重继承的不明确的基础

时间:2011-08-25 22:17:35

标签: c++ casting

我正在尝试在一个大型库中编写一些类的子类。我得到一个“模糊的基础”错误。以下是该问题的可编辑示例:

#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'的模糊基础。

在这种情况下我能做些什么吗?

4 个答案:

答案 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继承的类中来编译您的代码(我得到了至少编译的示例)。我不知道这是否是一个长期解决方案。