在C ++中继承抽象类和类实现

时间:2010-03-03 07:18:44

标签: c++ abstract-class multiple-inheritance

我希望这是一个简单的问题。

我可以继承抽象类及其实现吗?也就是说,可以使以下工作吗?

class A { 
   virtual void func1() = 0; 
}

class B {
   void func1() { /* implementation here */ }
}

class C : public A, public B {
}

我已经尝试了一些变体,并且在编译错误时抱怨C类中未实现的方法。但是,如果我能够完成这项工作,我可以保存很多重复的代码。有可能吗?


我通过创建一个名为D的“复合类”解决了这个问题,该复合类继承自A& B,但包含先前包含在B中的实现代码。这使得我的继承模型不那么干净,但它解决了问题而不需要代码重复。而且,正如我在下面的评论中指出的那样,它使我的命名惯例非常粗略。

class A { 
   virtual void func1() = 0; 
}

class B {
   // Other stuff
}

class D : public A, public B {
   void func1() { /* implementation here */ }
}

class C : public D {
}

4 个答案:

答案 0 :(得分:2)

class B不是代码中class A的实现。 Class B应该从class A继承而func1应该是虚拟的。只有在这种情况下,class B才会实现class A。然后就不需要继承A和B.

class A { 
   virtual void func1() = 0; 
}

class B : public A {
   virtual void func1() { /* implementation is here */ }
}

class C : public B {
}

否则,您将获得未实现的纯虚函数func1

答案 1 :(得分:1)

让B从A继承。如果不可能,使用虚拟继承也可能有用(我对此并不完全确定)。

答案 2 :(得分:1)

如果要在C类中重用B类中的代码,请尝试执行以下操作:

class C : public A, public B {
void func1(){ B::func1(); }
}

答案 3 :(得分:0)

基里尔指出:你的前提是错误的。

示例中的B类不继承A类(需要声明它首先执行该操作)。

因此,B.func1()与编译器的A.func1()完全不同。在C类中,它期望您提供A.func1()

的实现

上面有人发布了以下内容:

class C : public A, public B 
{
      // implement A::func1()
      virtual void func1()
      { 
           // delegate to inherited func1() in class B
           B::func1(); 
      }
}