是否可以通过继承实现接口?

时间:2015-03-17 16:54:00

标签: c++ inheritance polymorphism

struct I { 
      virtual void foo() = 0; 
      virtual void bar() = 0;
};

struct A { 
        void foo(){};
 };
struct B: public A, public I {

     void bar(){};
};

这个伪代码应该在C ++中有效吗?目前,我在链接时收到foo()未定义的引用错误。

如果这不起作用,请推荐一种创建接口的技术,该接口通过继承实现,如示例所示。

2 个答案:

答案 0 :(得分:6)

这取决于你的意思"有效"。您必须添加缺少的返回类型,并修复一些其他语法问题,以便进行编译。

如果你的意思是,"是B一个非抽象类,它正确地覆盖了在I?"中声明的两个纯虚函数,那么没有。它不会覆盖foo;继承同名函数不算作重写。

如果您希望A::foo成为I::foo的实现,那么您必须在B中添加包装以提供覆盖:

void foo() {A::foo();}  // assuming the missing return type is void

答案 1 :(得分:-1)

  1. 虚拟函数无法内联。您正在内联A :: foo()和B:bar()
  2. 您从B类中的两条路径继承I。通过A直接通过I.您还需要在B类中提供foo()的实现。