代码之家  ›  专栏  ›  技术社区  ›  Watusimoto

C++中抽象类与类实现的继承

  •  1
  • Watusimoto  · 技术社区  · 15 年前

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

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

    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 回复  |  直到 15 年前
        1
  •  0
  •   Daren Thomas    15 年前

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

    示例中的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(); 
          }
    }
    
        2
  •  2
  •   Kirill V. Lyadvinsky    15 年前

    class B 不是 class A 在你的密码里。 Class B 应该继承自 甲类 func1 应该是虚拟的。只有在那种情况下 乙类 将实施 甲类 . 然后就不需要同时从A和B继承了。

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

    否则将得到未实现的纯虚函数 函数1

        3
  •  1
  •   Tronic    15 年前

    使B从A继承。如果这不可能,使用虚拟继承也可以工作(对此我不完全确定)。

        4
  •  1
  •   Miollnyr    15 年前

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

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