虚函数
一.函数声明中的virtual关键字
•形如
class 类名
{
virtual 返回类型 函数名 (形参表) { … }
};
的成员函数,称为虚函数或方法
–class Shape
{
public:
virtual void draw (void) const { ... }
};
覆盖
一.在子类中覆盖基类的虚函数
•如果子类的成员函数和基类的虚函数具有相同的函数原型,那么该成员函数就也是虚函数,无论其是否带有virtual关键字,且对基类的虚函数构成覆盖
–class Rectangle : public Shape
{
public:
virtual void draw (void) const { ... }
};
–class Circle : public Shape
{
public:
void draw (void) const { ... }
};
多态
一.什么是多态
•如果子类提供了对基类虚函数的有效覆盖,那么通过一个指向子类对象的基类指针,或者引用子类对象的基类引用,
调用该虚函数,实际被调用的将是子类中的覆盖版本,而非基类中的原始版本,这种语法现象称为多态
–Rectangle r (...);
Circle c (...);
Shape* ps = &r;
ps->draw (); // 调用 Rectangle::draw
Shape& rs = c;
rs.draw (); // 调用Circle::draw
二.多态的意义
•多态的重要意义在于,一般情况下,调用哪个类的成员函数是由调用者指针或引用本身的类型决定的,而当多态发生时,
用哪个类的成员函数则完全由调用者指针或引用的实际目标对象的类型决定。这样一来,源自同一种类型的同一种
激励,竟然可以产生多种不同的响应,谓之多态
–void drawAny (Shape const& shape)
{
shape.draw ();
}
–void drawAll (Shape const* shapes[])
{
for (size_t i = 0; shapes[i]; ++i)
shapes[i]->draw ();
}