C ++纯虚拟派生函数

时间:2018-11-27 05:29:35

标签: c++ inheritance virtual

我正在学习面向对象的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
}

我的理解是,除非将getWidth指定为virtual,否则多态将使用“ Base”类的功能。我的意思是说r-> getArea的最后一次调用应该使用矩形的getArea而不是Square的getArea。

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

您无需具有纯虚函数即可获得多态行为。普通的虚拟功能也可以实现。

是的,在类中将函数指定为virtual意味着它在所有从其派生的类中都保留virtual

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