我误解了c ++纯虚函数和接口的东西

时间:2012-07-05 08:10:58

标签: c++ inheritance pure-virtual

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

界面

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

}

3 个答案:

答案 0 :(得分:6)

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

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

此外,您的语法很接近:

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

上述内容应该有效,即使它不是来自Base,因为您从Interface实现了纯虚方法。

建议 - 制作getName方法const

答案 1 :(得分: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();

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

修改:关于虚拟继承的使用,请参阅herehere以获取更多信息。

答案 2 :(得分:0)

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