【问题标题】:How to avoid multiple implementation of class functions如何避免类函数的多次实现
【发布时间】:2018-05-18 04:22:26
【问题描述】:

我是 C++ 新手,因此需要一些帮助。 代码如下:

class InterfaceVehicle
{
  virtual int door() = 0;
  virtual int seats() = 0;
  virtual int enginepower() = 0; 
}
class minicar: public InterfaceVehicle
{
    int door () {return 4;}
    int seats () {return 2;}
    int enginepower () {return 10;}
}

class bigcar: public InterfaceVehicle
{
    int door () {return 4;}
    int seats () {return 5;}
    int engine () {return 20;}
}

class truck: public InterfaceVehicle
{
    int door () {return 2;}
    int seats () {return 1;}
    int engine () {return 50;}
}

我有一个名为 Vehicle 的接口基类和三个不同的类,它们实现了接口类的所有功能。在这里,我想避免门功能的相同实现。 我得到了一些建议,希望有一个新的类来实现这个门功能,这个类将被聚合到 bigcar 和 minicar 中。这样我可以避免门()的这种复制粘贴实现;我喜欢这个主意!

能否举个例子说明我如何实现它? 我阅读了很多关于聚合的内容,但不明白如何在我的情况下实现它。

【问题讨论】:

    标签: c++ class polymorphism virtual aggregation


    【解决方案1】:

    我还没有评论的声誉,所以我将其添加为答案。

    看看这个 stackoverflow 答案:How to call a parent class function from derived class function?

    您需要创建一个父类来实现您的接口并定义门,但将其他两个函数保留为虚函数。然后继承该类并在子类中定义其余函数。然后可以从子类调用父类中的门函数。

    【讨论】:

    • 这个我不确定,任何继承了纯虚函数接口的类,都必须实现所有的虚函数。所以,我猜父类也应该有InterfaceVehicle中所有功能的实现
    • @User89 您可以在父类中将它们实现为纯虚函数,这将使父类成为抽象类。 multiple-inheritance-and-pure-virtual-functions
    【解决方案2】:

    InterfaceVehicle 是一个接口,因为它声明了所有方法但未实现,但为了达到您的目的,解决方案是构建** AbstractVehicle** 即一个抽象类 而不是一个接口。
    作为接口,抽象类不能被实例化,但它可以为一些常见的行为提供实现。 例如,如果MinicarBigCar 需要door() 的相同实现,而Truck 需要另一个,则可以将基类中的通用行为指定为

    class AbstractVehicle{   
            virtual int door() { return 4;} ;
            virtual int seats() = 0;
            virtual int enginepower() = 0; 
    }
    
    class Minicar: public virtual AbstractVehicle
    {
        int seats () {return 2;}
        int enginepower () {return 10;}
    }
    
    class Bigcar: public virtual AbstractVehicle
    {
        int seats () {return 5;}
        int engine () {return 20;}
    }
    
    class Truck: public virtual AbstractVehicle
    {
        int door () {return 2;}
        int seats () {return 1;}
        int engine () {return 50;}
    }
    

    通过这种方式,子类不必遵守方法 door() 的约定,它们可以覆盖它(在卡车需要另一个实现的情况下),但它们不是强制的实现这一点,因为他们必须seats()enginepower()纯抽象方法做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多