我对 c++ 纯虚函数和接口的误解

Something I misunderstand with c++ pure virtual function and interfaces

本文关键字:接口 误解 函数 c++ 我对      更新时间:2023-10-16

我喜欢在几个类中定义良好的接口,为此,我在抽象类中创建了纯虚函数,每个类都需要实现。
但是我面临的问题是我可以实例化类,所以我必须创建另一个继承接口类的类,而所有其他类都需要从这个基类继承。下面是代码示例:

界面

class Interface
{
     virtual std::string getName() = 0;
}
class Base : public Interface
{
   virtual std::string getName(return std::string("Base") ;)
}
class A : public Base
{
  std::string getName(return std::string("A") ;)
}
class B : public Base
{
  std::string getName(return std::string("B") ;)
}

所有这些,所以我可以在代码中为 A 和 B 使用相同的类型。
我可以只使用 Interface 类而不使用 Base 类吗?
像这样:

class A : public Interface
{
  std::string getName(return std::string("A") ;)
}

不,他们没有。所有从接口(直接或间接)继承的类都必须在继承树中的某处实现纯virtual函数才能实例化。

因此,您可以在基类或顶级类中实现该方法。

此外,您的语法也相差甚远:

class A : public Interface
{
  std::string getName()
  {
      return std::string("A");
  }
};

即使它不是从Base派生的,上面的方法也应该有效,因为你从Interface实现了纯虚方法。

建议 - 使您的getName方法const

你不能实例化接口,但你可以做的是有一个指向接口的指针,指向一个实现的实例:

class Interface { /* pure virtual methods */ };
class A : virtual public Interface { /* implement all pure virtual methods */ };
class B : virtual public Interface { /* implement all pure virtual methods */ };
Interface * i0 = new A();
Interface * i1 = new B();

这是使用多态类的标准方法(尽管您可能希望使用智能指针而不是原始指针)。

编辑:关于虚拟继承的使用,有关更多信息,请参阅此处和此处。

如果基类具有纯虚函数,则无法创建基类的实例,因为它是抽象基类。如果你需要能够实例化这个类,其中没有任何纯虚函数。否则,只需从中得出。