2016-09-17 42 views
-3

我有这个问题,我不知道如何正确解决。C++ - OOP设计 - 多继承和纯虚方法

class A : public B, public C 
{ 
    virtual void GetSomethingElse() 
    { 
    } 
} 

class B 
{ 
    public void GetSomething() 
    {  
     GetSomethingElse(); 
    } 

    virtual void GetSomethingElse() = 0; 
} 

class C 
{ 
    virtual void GetSomethingElse() = 0; 
} 

基本上,我有两个抽象类BC。通常,我只需要继承其中的一个,但在某些特定情况下,我需要这两者。

如何用GetSomethingElse()方法正确解决此问题,需要从B调用该方法。如果我只继承B,它将在孩子身上实施。如果只从C,一切还是可以的。 但是,如果我继承BC,我有一些“奇怪”的设计,即钻石继承问题,但它是完全不一样的。

+2

我没有看到从B和C继承的问题。究竟是什么问题? –

+0

你能提供能够真正产生你想解决的错误的代码吗? – Galik

回答

2

正如您已经提到的,它与钻石问题完全不同。

您的设计是正确的,而不是被玷污的。让GetSomeThingElse为纯虚拟是强制孩子定义它。如果是因为C或B而定义它不是设计问题。 如果您的设计是纯虚拟设计,而您是虚拟设计(B或C),您可能会遇到设计问题。

-1

由于它们是抽象的,您需要覆盖class A中的方法。 每个对象都会知道它是否为BC,因此它会调用正确的函数。

但是,如果您的类C没有函数GetSomething(),那么您的继承结构是错误的方法 - 记住继承的逻辑是派生类的每个对象也是父类的对象?所以如果一个A不是B因为没有这样的呼叫,那么有些事情是错误的。

另一点是推导virtual,所以两个相同的功能被认为是相同的:class A : virtual public B, virtual public C

你考虑做一类就是B和C的家长吗?如果他们没有共同的父母,为什么他们有一个同名的功能?

0
class A : public B, public C 
{ 
    virtual void GetSomethingElse() 
    { 
    } 
} 

class B:public class D 
{ 
    public void GetSomething() 
    {  
     GetSomethingElse(); 
    } 

    virtual void GetSomethingElse() 
    { 
    } 
} 

class C:public class D 
{ 
    virtual void GetSomethingElse() 
    { 
    } 
} 

//here's the only pure virtual base class 
class D 
{ 
    virtual void GetSomethingElse() = 0; 
}