0

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

界面

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") ;)

}
4

3 回答 3

6

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

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

此外,您的语法很差:

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

即使它不是从 派生的,上面也应该可以工作Base,因为您实现了纯虚方法 from Interface

建议——制定你的getName方法const

于 2012-07-05T08:14:05.910 回答
4

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

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();

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

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

于 2012-07-05T08:21:50.097 回答
0

如果基类具有纯虚函数,则不能创建基类的实例,因为它是抽象基类。如果您需要能够实例化此类,则其中没有任何纯虚函数。否则简单地从中派生。

于 2012-07-05T08:13:49.077 回答