C++ 纯虚派生函数

C++ Pure virtual derived function

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

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

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"class的函数,除非getWidth被指定为virtual。我的意思是 r->getArea 的最终调用应该使用 Rectangle 的 getArea 而不是 Square 的 getArea。

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

virtual是继承的。如果你创建一个父函数 virtual 那么它将在所有子函数中保持 virtual-类.

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

是的,在 class 中将函数指定为 virtual 意味着它在从它派生的所有 class 中保持 virtual

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

的虚函数