我正在学习面向对象的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中的纯虚拟声明,我们将得到刚才描述的行为。在基类中具有纯虚函数会自动将该函数的所有定义虚拟化吗?
答案 0 :(得分:4)
virtual
被继承。如果您创建父函数virtual
,那么它将在所有子类中继续为virtual
。
答案 1 :(得分:4)
您无需具有纯虚函数即可获得多态行为。普通的虚拟功能也可以实现。
是的,在类中将函数指定为virtual
意味着它在所有从其派生的类中都保留virtual
。
从C ++ 11开始,还有override
说明符:
在成员函数声明或定义中,override
确保函数为virtual
并从基类中覆盖虚拟函数。