【问题标题】:C++ Pure virtual derived functionC++ 纯虚派生函数
【发布时间】:2018-11-27 05:29:34
【问题描述】:

我正在学习面向对象的 C++,并且有一个关于虚拟/纯虚拟和多级继承的问题。

假设我有这样的简单代码:

class Shape
{
    virtual int getWidth() = 0;
};
class Rectangle: public Shape
{
private:
    int length, width;
public:
    Rectangle(_length, _width) { length = _length; width = _width }
    int getWidth() { return width }
};
class Square: public Rectangle
{
private:
    int length;
public:
    Square(int _length):Rectangle(_length, _length) { length = _length };
    int getWidth() { return length+1 }; //arbitarily add 1 to distinguish
};

int main()
{
    Rectangle* r = new Square(5);
    std::cout << r->getWidth << std::endl;  //prints 6 instead of 5?  It's as if rectangles getWidth is virtual
}

我的理解是多态性将使用“Base”类的功能,除非将getWidth指定为虚拟。我的意思是 r->getArea 的最终调用应该使用 Rectangle 的 getArea 而不是 Square 的 getArea。

在这种情况下,我注意到如果我删除 Shape 中的纯虚拟声明,我们会得到我刚才描述的行为。在基类中拥有一个纯虚函数会自动使该函数的所有定义成为虚函数吗?

【问题讨论】:

    标签: c++ inheritance virtual


    【解决方案1】:

    virtual 被继承。如果您创建一个父函数virtual,那么它将在所有子类中继续为virtual

    【讨论】:

    • 我认为最好通过将所有继承的虚函数声明为虚拟来在所有派生类中明确这一点?
    • @briansrls 更好的做法是声明覆盖函数override(这会使virtual 变得相当多余)。
    • 换句话说,它是“虚拟的”:-)
    【解决方案2】:

    你不需要一个纯虚函数来获得多态行为。普通的虚函数也可以完成。

    是的,在类中将函数指定为 virtual 意味着它在从它派生的所有类中仍然是 virtual

    从 C++11 开始,还有 override 说明符:
    在成员函数声明或定义中,override 确保该函数是 virtual 并覆盖基类中的虚函数。

    【讨论】:

    • 好的,我将在派生类覆盖的虚函数中包含覆盖。包含关键字“virtual”和“override”会是多余的吗?
    • 是的。有关更多信息,请参阅此问题和答案。 stackoverflow.com/questions/43466863/…
    猜你喜欢
    • 2018-05-02
    • 2018-10-14
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多