【问题标题】:Defining functions in derived classes在派生类中定义函数
【发布时间】:2014-04-04 09:17:36
【问题描述】:

假设我有一个基类fruit和三个派生类Apple、orange和mango。现在我只想在Apple类中定义一个成员函数“taste”。那我该怎么做呢? 是否有必要在基类和所有派生类中定义它或者我只能在一个所需的类中定义它,即苹果 我必须为此使用虚函数吗

感谢和问候

【问题讨论】:

    标签: c++ subclass virtual-functions base-class


    【解决方案1】:

    您不必在基类中定义它。但是,您将无法在基类指针或引用上调用此方法。该函数不需要是虚拟的。

    class Fruit {};
    class Apple : public Fruit
    {
    public:
        void Taste();
    }
    
    class Orange : public Fruit {}
    class Mango : public Fruit {}
    
    Fruit* f = new Apple();
    f->Taste(); // Error
    Apple* a = new Apple();
    a->Taste() // Ok
    

    但是,如果您想从基类指针或引用访问该方法,则需要在基类中定义一个虚方法的空实现并在 Apple 类中覆盖它。

    class Fruit
    {
    public:
        virtual void Taste() {}
    };
    class Apple : public Fruit
    {
    public:
        virtual void Taste()
        {
            // Do something.
        }
    }
    
    class Orange : public Fruit {}
    class Mango : public Fruit {}
    
    Fruit* f = new Apple();
    f->Taste(); // Ok
    Fruit* f2 = new Orange();
    f2->Taste(); // Ok and no side effect.
    

    【讨论】:

    • 那么如何从派生类调用这个方法。实际上我想在基类指针上调用这个方法,但同时我不想在每个派生类中都包含它,因为它非常大代码大小
    • 苹果a;一种味道();如果在 base 中将其定义为空,则不必在每个继承的类中重新定义它,除非您想像在 Apple 中那样更改默认实现。看我的第二个例子
    • 水果应该是纯虚拟的,那样感觉更好。 virtual void Taste() = 0;
    • @Roger Rabbit 我同意,但要求是不要在每个继承的类中都有它。
    • 比看我下面的答案,你可以将 Taste 定义为一个类(它在答案中充分解释),并且在每种情况下你都需要一个“Taste”,你只需添加“Taste”类
    【解决方案2】:

    在一般设计模式中,应将类行为和质量作为模式添加到称为 taset 的不同子类中。

    这是鸭子的一个很好的例子,这也适用于你的水果

    http://www.cs.colorado.edu/~kena/classes/5448/f09/lectures/16-introdesignpatterns.pdf

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 2011-11-15
      相关资源
      最近更新 更多