虚函数,覆盖和多态

虚函数

一.函数声明中的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 (); 
 }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值