返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中关键字 override 的简析
  • 242
分享到

C++中关键字 override 的简析

2024-04-02 19:04:59 242人浏览 安东尼
摘要

目录在c++中,虚函数是最常见的实现多态的机制之一,来个最简单的例子温习一下: class Base // 基类 { public: virtual void f(){c

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 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++中关键字 override 的简析

本文链接: https://lsjlt.com/news/136892.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++中关键字 override 的简析
    目录在C++中,虚函数是最常见的实现多态的机制之一,来个最简单的例子温习一下: class Base // 基类 { public: virtual void f(){c...
    99+
    2024-04-02
  • C#关键字之重写override介绍
    一、简介 override意思是重写。它是在子类中重写父类中的方法,两个函数的函数特征(函数名、参数类型与个数)相同,用于拓展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现,提...
    99+
    2024-04-02
  • 怎么浅析C++中的C++关键字
    怎么浅析C++中的C++关键字,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在C++语言中,然后就总结了许多C++关键字,如果不使用常引用、指针,则须用const_cast&l...
    99+
    2023-06-17
  • C#关键字Check简单介绍
    目录功能描述注意事项程序演示功能描述 checked运算符通知运行时当溢出时抛出一个OverflowException异常,checked运算符可以用于++, --, -(一元), ...
    99+
    2024-04-02
  • C++ requires关键字简单介绍
    requires 是 C++20 中引入的一个新关键字,用于在函数模板或类模板中声明所需的一组语义要求,它可以用来限制模板参数,类似于 typename ...
    99+
    2023-05-20
    C++ requires关键字 C++ requires
  • c++11中的noexcept关键字
    目录c++11中noexcept关键字1. 概念2. 两种形式3. 异常处理4. 实现原理5. 使用场景c++11关键字noexcept替代throwc++11中noexcept关键...
    99+
    2024-04-02
  • C++ const关键字分析详解
    目录C语言中修饰变量C语言中修饰指针变量C语言中修饰函数的参数C++中修饰变量C++中修饰函数的参数C++中修饰函数的返回值C++中修饰类的成员函数C++中修饰类的成员变量总结C语言...
    99+
    2024-04-02
  • C语言Static 关键字解析
    目录01简述02static关键字作用01简述 static关键字在嵌入式C语言当中很简单,它有三个作用: 作用一:在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变...
    99+
    2024-04-02
  • C++ Explicit关键字详细解析
    explicit关键字用来修饰类的构造函数,表明构造函数是显示的,相对的是implicit关键字。首先这个关键字只能用在类内部的构造函数声明上,而不能用在类外部的函数定义上,它的作用...
    99+
    2022-11-15
    Explicit 关键字
  • C/C++中的static关键字详解
    目录C/C++ 中的 static1. 静态局部变量2. 静态全局变量3. static 修饰函数C++的 static 成员静态成员变量 静态成员函数总结:static是...
    99+
    2024-04-02
  • C#中的关键字有哪些
    这篇文章主要讲解了“C#中的关键字有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中的关键字有哪些”吧!C# 关键字关键字是 C# 编译器预定义的保留字。这些关键字不能用作标识符,但...
    99+
    2023-06-17
  • C++中auto关键字的使用
    前提引入 1.类型名,在绝大多数编程时,我们都会引入类型来定义一个我们需要的数据。 类型众多,偶尔我们会遇见一串类型名,使用起来无比复杂。存在拼写错误,含义不明确导致出错的问题。 列...
    99+
    2023-05-15
    C++ auto关键字 C++ auto
  • C++中的explicit关键字详解
    目录前言1. 抑制构造函数定义的隐式转换2. 为转换显式地使用构造函数3. 类型转换运算符可能产生意外结果4. 显示的类型转换运算符5. explicit练习5.1 当不使用expl...
    99+
    2024-04-02
  • C# 中的partial 关键字详解
    目录引言分部类partial 分部限制分部接口和结构分部方法this 和 partial 的区别引言 partial 关键字用于拆分一个类、一个结构、一个接口或一个方法的定义到两个或...
    99+
    2024-04-02
  • C#中ref关键字的用法
    在C#中,如果在方法参数前面加上ref关键字,说明参数传递的是引用,而不是值。如何理解呢? 参数是简单类型的例子 static void Main(string[] ...
    99+
    2022-11-13
    C# ref关键字
  • C#中的yield关键字详解
    在"C#中,什么时候用yield return"中,我们了解到:使用yield return返回集合,不是一次性加载到内存中,而是客户端每调用一次就返回一个集合元...
    99+
    2024-04-02
  • c++中inline关键字的作用
    c++ 中 inline 关键字指示编译器在可能的情况下将函数内联。作用有:减少函数调用的开销,提高频繁调用的函数性能。改善代码可读性。提高编译时间。最佳实践:将频繁调用的小型函数标记为...
    99+
    2024-05-12
    c++ 代码可读性
  • c#中this关键字的作用
    this 关键字在 c# 中用于引用当前对象,可用于访问其成员,区别不同对象,在基类和派生类中访问父类成员,传递当前对象作为参数,与扩展方法一起使用。 this 关键字在 C# 中的作...
    99+
    2024-05-15
    c#
  • c#中声明类的关键字
    在 c# 中声明类的关键字为 "class"。该语法为 "class classname { // 类成员 }",其中 classname 为类的名称,{} 包含类的成员(如字段、属性、...
    99+
    2024-05-15
    c#
  • c++中static关键字的作用
    在 c++ 中,static 关键字用于声明变量或函数,使其仅在声明的范围内可见,在程序启动时分配内存,并且保持不变。此外,它还允许跨函数和文件共享数据、存储常量、创建静态局部变量并定义...
    99+
    2024-05-15
    c++ 作用域
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作