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

How to properly expose C++ API using interfaces including derived interfaces?

本文关键字:接口 正确地 C++API 何使用 包括 派生      更新时间:2023-10-16

下面的代码说明了这个问题。我正在尝试为C++组件创建一个API,只使用接口(C++虚拟类(。我有一个Base和Derived类,并有相应的IBase和IDerived接口,但当我尝试将IBase强制转换为Derived时,这会导致错误。错误C2594:"类型强制转换":从"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();
  }
};

您所看到的是多重继承。您的Derived来源于:

  • IDerived,源自IBase
  • Base,其源自IBase

因此,当您想像函数handle_base()中的Derived指针一样处理IBase指针时,不清楚您指的是哪个IBase:来自IDerived的那个,还是来自Base的那个。

解决方案可以是使用public virtual继承。不过,您可能应该查看一下C++FQA Light。

你关于"Java或C#不会对此嗤之以鼻"的评论并不完全正确。即使C++中的纯虚拟基类仍然是,而不是接口(在Java的意义上(,即仍然存在多重继承的情况。Java的解决方案是区分类和接口;C++的解决方案之一是虚拟继承。