0

下面的代码说明了这个问题。我正在尝试为仅使用接口(C++ 虚拟类)的 C++ 组件创建 API。我有一个 Base 和 Derived 类,并且有相应的 IBase 和 IDerived 接口,但是当我尝试将 IBase 强制转换为 Derived 时,这会导致错误。错误 C2594:“类型转换”:从“IBase *”到“派生 *”的模糊转换

这似乎是我正在尝试做的一件合理的事情,Java 或 C# 不会对此嗤之以鼻。有没有办法在 C++ 中实现这样的东西

class IBase
{
public :
  virtual int method_A(void) = 0;
  virtual int method_B(void) = 0;
  virtual int method_C(void) = 0;
};

class IDerived : public IBase
{
public :
  virtual int method_D(void) = 0;
};

class Base : public IBase
{
  int method_A(void) {return 1;};
  int method_B(void) {return 2;};
  int method_C(void) {return 3;};
};

class Derived : public IDerived, private Base
{
public:
  int method_D(void) {return 4;};
};

class HandleDerived
{
public :
  int handle_base(IBase * i_base)
  {
    Derived * derived = (Derived *) i_base;
    return derived->method_D();
  }
};
4

1 回答 1

3

您正在查看的是多重继承。您Derived来自:

  • IDerived,它来源于IBase
  • Base, 这源自IBase

因此,当您想处理函数中的IBase指针之类的指针时,不清楚您指的是哪个:来自 的那个,还是来自 的那个。Derivedhandle_base()IBaseIDerivedBase

解决方案可能是使用public virtual继承。但是,您可能应该查看有关此事的C++ FQA Light 。

您关于“Java 或 C# 不会眨眼”的评论并不完全正确。即使是 C++ 中的纯虚拟基类仍然是,而不是接口(在 Java 的意义上),即您仍然有多重继承的情况。Java的解决方案是区分类和接口;(之一)C++ 的解决方案是虚拟继承。

于 2013-03-11T09:38:05.580 回答