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.
的虚函数
我正在学习面向对象的 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.