前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关键字《override》简析

关键字《override》简析

作者头像
用户2617681
发布2019-08-08 15:01:32
5530
发布2019-08-08 15:01:32
举报
文章被收录于专栏:秘籍酷

C++中的关键字 override,它的含义其实两句话就说完了,但为了叙述的完整性,让我们从虚函数说起。在C++中,虚函数是最常见的实现多态的机制之一,来个最简单的例子温习一下:

代码语言:javascript
复制
class Base // 基类
{
public:
    virtual void f(){cout << "Base::f()" << endl;}
};

class Derived1 : public Base // 派生类1
{
    virtual void f(){cout << "Derived1::f()" << endl;}
};

class Derived2 : public Base // 派生类2
{
    virtual void f(){cout << "Derived2::f()" << endl;}
};

(以上代码请忽略排版风格)

以上是一个基类 Base 及其派生子类的最简示例,基类中有一个普通虚函数 f( ),并且派生类们都复写(即override)了该虚函数。

以上代码的含义再清楚不过:我们希望通过基类指针或者基类引用,可以调用派生类版本的函数 f( ),以此实现所谓的多态,如下代码所示:

代码语言:javascript
复制
Base *b;
    
b  = new Derived1;
b->f(); // 打印 "Derived1::f()"
    
b = new Derived2;
b->f(); // 打印 "Derived2::f()"

但,作为一名普通虚函数 f( ),它实际上并不要求我们一定要复写(即override)它,假如你在派生类中不复写它,那么派生类将很自然地使用基类所提供的备用版本。

危险就在于此,人类是一个有诸多毛病的物种,其中一个根深蒂固的毛病是自以为是和粗心大意,因此以下代码很有可能出自某个同胞之手:

代码语言:javascript
复制
class Derived3 : public Base // 派生类3
{
    // 注意:以下函数有参数
    // 人类以为复写了基类虚函数,但实际并没有
    virtual void f(int){cout << "Derived3::f()" << endl;}
};

很明显,这位同胞的本意与以上两个派生类相同:派生出Derived3,并复写虚函数 f( )。很可惜,如果此时这位同胞贸然执行如下代码,将带来灾难性的后果:

代码语言:javascript
复制
Base *b;
b = new Derived3;
b->f(); // 原想打印 "Derived3::f()"
        // 实际却打印"Base::f()"!

如果这不够灾难,可以将函数 f( ) 想象成民航飞机的起飞引导程序。

现在问题很明显了:

由于人类的愚蠢,派生类的虚函数的复写,很有可能出现乌龙——人类自以为复写了基类的虚函数(比如 void f( )),但实际上却写了另一个函数(比如 void f(int)),要命的是C++语法并不制止这种愚蠢的行为,它会以为这是我们出于某种神秘的原因才这么干的。

然后,愚蠢的人类执行程序,卒。

解决办法:

消除人类与编译器之间深刻的误会,即:我们在想复写虚函数的时候,也同时将此想法明明白白地告诉编译器,别让它有什么误会。怎么告诉它呢?蹬蹬~噔噔~憋了半天主角终于出场鸟:

代码语言:javascript
复制
class Derived3 : public Base // 派生类3
{
    // 注意:
    // 此处的 override 明明白白告诉编译器:我要复写虚函数
    // 但由于基类没有 void f(int),因此此处将报错!哦也!
    virtual void f(int) override 
    {cout << "Derived3::f()" << endl;}
};

the End.

识别下面二维码进入 微店●秘籍酷 瞅一眼呗!也许有你喜欢的东西

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秘籍酷 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档