zoukankan      html  css  js  c++  java
  • C++:override和final

    1. override 重载

      当你在父类中使用了虚函数时候,你可能需要在某个子类中对这个虚函数进行重写,以下方法都可以:

    class A
    {
        virtual void foo();
    }
    class B :public A
    {
        void foo(); //OK
        virtual foo(); // OK
        void foo() override; //OK
    }

      如果不使用override,当你手一抖,将foo()写成了f00()会怎么样呢?结果是编译器并不会报错,因为它并不知道你的目的是重写虚函数,而是把它当成了新的函数。如果这个虚函数很重要的话,那就会对整个程序不利。

      所以,override的作用就出来了,它指定了子类的这个虚函数是重写的父类的,如果你名字不小心打错了的话,编译器是不会编译通过的:

    class A
    {
        virtual void foo();
    };
    class B :A
    {
        virtual void f00(); //OK
        virtual void f0o()override; //Error 
    };

      为了减少程序的运行时错误,还是养成重写虚函数加上override的习惯吧。

    2.final

      当不希望某个类被继承,或不希望某个虚函数被重写,可以在类名和虚函数后添加final关键字,添加final关键字后被继承或重写,编译器会报错。例子如下:

    class Base
    {
        virtual void foo();
    };
     
    class A : Base
    {
        void foo() final; // foo 被override并且是最后一个override,在其子类中不可以重写
        void bar() final; // Error: 父类中没有 bar虚函数可以被重写或final
    };
    
    class B final : A // 指明B是不可以被继承的
    {
        void foo() override; // Error: 在A中已经被final了
    };
     
    class C : B // Error: B is final
    {
    };

      

    ------------ 转载请注明出处 ------------
  • 相关阅读:
    Windows下_findnext()异常问题
    Windows 10正式版官方原版镜像!(备忘)
    qt中出现error: C2059: 语法错误:“namespace”未定义等大量错误的问题
    linux shell的简单思维导图
    高仿花生壳客户端程序(qt)
    公告
    修改注册表自定义键盘快捷键
    斜率优化
    元旦老人与丛林
    CF 1466G Song of the Sirens
  • 原文地址:https://www.cnblogs.com/whlook/p/6501918.html
Copyright © 2011-2022 走看看