我们可以从继承的类中覆盖纯虚函数吗?

时间:2017-01-10 09:31:28

标签: c++ inheritance override virtual-functions pure-virtual

我有一个接口类 - IAnimal和2个派生类--Tcat和Tdog。 我希望Tcat和Tdog都继承Eat函数,但是,我希望Tcat能够拥有2个参数,而Tdog拥有它继承的参数。 这可能吗?

/// Pure virtual - to ensure all inherited animals have eat and sleep
class IAnimal
{
public:
    virtual ~IAnimal() {}
    virtual bool Eat(int _i_food) = 0;
    virtual bool Sleep(int _i_time) = 0;
};

class TCat : public IAnimal
{
public:
    bool Eat(int _i_food, int _i_amount); // can we override interface pure virtual from inherited class? 
    bool Sleep(int _i_time);
};

class TDog : public IAnimal
{
public:
    bool Eat(int _i_food);
    bool Sleep(int _i_time);
};

4 个答案:

答案 0 :(得分:2)

否。无法更改virtual方法的签名。甚至没有默认参数 唯一的例外是covariance,其中返回类型可以不同。

使用C ++ 11,经验法则是在假定的override方法之后放置virtual说明符(纯粹或不纯)。如果它没有编译,那么出了点问题。在您的代码示例中,以下将无法编译:

bool Eat(int _i_food, int _i_amount) override;  // error

答案 1 :(得分:0)

没有

这是不可能的。它也没有意义,因为如果这些函数具有不同的签名,您将无法通过接口调用它们。如果通过接口传递一个参数并且实际实例需要两个参数会发生什么?

所能做的是覆盖你所拥有的那个,然后添加一个带有两个参数的附加方法。但是你无法通过界面调用新的。

答案 2 :(得分:0)

您需要提供所有纯虚函数的实现。您可以覆盖函数Eat(int _i_food),但是无法使用指向基类的指针调用重载版本。

答案 3 :(得分:0)

你的问题是TCat中的Eat方法不是它的基类中的方法的重写,而是重载,它“隐藏”基类方法。

看到这个问题:

Why does a virtual function get hidden?