2010-03-03 106 views
0

我希望这是一个简单的问题。在C++中继承抽象类和类实现

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

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

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

class C : public A, public B { 
} 

我已经尝试了一些变化,和我越来越但是编译错误抱怨类C.未实现的方法,我可以节省大量重复的代码,如果我可以做这项工作。可能吗?


我解决了这个通过创建一个“复合类”叫d,从一个&乙继承,而是包含以前包含在B的实现代码这让我继承模型不干净,但它不解决问题需要代码复制。而且,正如我在下面的评论中指出的那样,这使得我的命名规则非常糟糕。从A

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

class B { 
    // Other stuff 
} 

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

class C : public D { 
} 

回答

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(); 
     } 
} 
+0

嗯,我想我们已经缩小了问题的范围,找到一个好的命名约定: class LuaPolygonalGameObject:public GameObject,public Polygon,public LuaItem // Composite class yuck!但它确实编译! – Watusimoto 2010-03-03 07:47:50

1

制作乙继承。如果这是不可能的,使用虚继承也可能工作(我不是这个完全肯定)。

+1

在这种情况下,A和B是非常不同的类,真正除少数功能之外没有任何共同之处。 – Watusimoto 2010-03-03 07:26:10

+0

当你使用非虚拟继承时,C得到两个完全分离的func1函数。 – Tronic 2010-03-03 07:29:19

+0

如果B没有从A继承,并且您试图通过将它们混合在一起来重写A的函数,那么它将会非常黑客,并且Diamond继承仍然需要B继承A,它必须是: B类:虚拟A C类:虚拟A,B – matt 2010-03-03 07:29:34

1

如果你想重新使用在C级B级代码,试图做这样的事情:

class C : public A, public B { 
void func1(){ B::func1(); } 
} 
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