繁体   English   中英

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

[英]Inheriting both abstract class and class implementation in C++

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

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

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 {
}

class B不是代码中class A的实现。 Class B应该继承自class Afunc1应该是虚拟的。 只有在这种情况下, 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

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

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

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

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

您的示例中的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(); 
      }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM