如何使用包括派生接口的接口正确公开C ++ API?

时间:2013-03-11 09:27:13

标签: c++ interface casting

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

我正在尝试做的事情似乎是合理的,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();
  }
};

1 个答案:

答案 0 :(得分:3)

您正在研究的是多重继承。您的Derived源自:

  • IDerived,源自IBase
  • Base 派生自IBase

因此,当您想要在函数IBase中处理Derived指针之类的handle_base()指针时,不清楚您指的是哪个IBase:一个来自IDerived,一个来自Base

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

关于“Java或C#不会打击眼睑”的评论并不是很明显。即使是C ++中的纯虚基类仍然是,而不是接口(在Java的意义上),即你仍然有一个多继承的情况。 Java的解决方案是区分类和接口; (其中之一)C ++的解决方案是虚拟继承。

相关问题