【问题标题】:C++ - OOP design - multiple inheritance and pure virtual method [duplicate]C ++ - OOP设计 - 多重继承和纯虚方法[重复]
【发布时间】:2016-09-17 17:03:14
【问题描述】:

我有这个问题,不知道如何正确解决。

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,我有一些“奇怪”的设计,类似于钻石继承问题,但完全不一样。

【问题讨论】:

  • 我没有看到从 B 和 C 继承的问题。您到底有什么问题?
  • 您能否提供实际生成您希望解决的错误的代码?

标签: c++ oop


【解决方案1】:

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

你的设计是正确的,没有古怪。将 GetSomeThingElse 作为纯虚拟是强制孩子定义它。如果是因为 C 或 B 而定义它不是设计问题。 如果它在一个中是纯虚拟的,而在另一个(B 或 C)中是虚拟的,那么您将遇到设计问题,因为一个给您选择,另一个给您选择。

【讨论】:

    【解决方案2】:
    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;
    }
    

    【讨论】:

      【解决方案3】:

      由于它们是抽象的,您需要覆盖class A 中的方法。 每个对象都会知道它是B 还是C,所以它会调用正确的函数。

      然而,如果你的类 C 没有函数GetSomething(),那么你的继承结构是错误的——还记得继承的逻辑是派生类的每个对象也是父类的对象吗?因此,如果 A 不是 B,因为 is 没有这样的调用,那就有问题了。

      还有一点是推导virtual,所以两个相同的函数被认为是相同的:class A : virtual public B, virtual public C

      您是否考虑过创建一个作为 B 和 C 的父类的类?如果他们没有共同的父母,为什么他们有一个同名的函数?

      【讨论】:

        猜你喜欢
        • 2014-11-06
        • 2012-10-11
        • 1970-01-01
        • 2012-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-09
        • 2014-06-02
        相关资源
        最近更新 更多