文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++中关键字 override 的简析

2024-04-02 19:55

关注

在C++中,虚函数是最常见的实现多态的机制之一,来个最简单的例子温习一下:


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( ),以此实现所谓的多态,如下代码所示:


Base *b;
    
b  = new Derived1;
b->f(); // 打印 "Derived1::f()"
    
b = new Derived2;
b->f(); // 打印 "Derived2::f()"

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

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


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

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


Base *b;
b = new Derived3;
b->f(); // 原想打印 "Derived2=3::f()"
        // 实际却打印"Base::f()"!

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

现在问题很明显了:

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

然后,执行程序,就这。。

解决办法:

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


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

到此这篇关于C++中关键字 override 的简析的文章就介绍到这了,更多相关C++中关键字 override 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯