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

    override关键字作用:
    如果派生类在虚函数声明时使用了override描述符,那么该函数必须重载其基类中的同名函数,否则代码将无法通过编译。
    举例子说明

    struct Base
    {
    virtual void Turing() = 0;
    virtual void Dijkstra() = 0;
    virtual void VNeumann(int g) = 0;
    virtual void DKnuth() const;
    void Print();
    };
    struct DerivedMid: public Base
    {
    // void VNeumann(double g);
    //接口被隔离了,曾想多一个版本的VNeumann函数
    };
    struct DerivedTop : public DerivedMid
    {
    void Turing() override;
    void Dikjstra() override; //无法通过编译,拼写错误,并非重载
    void VNeumann(double g) override; //无法通过编译,参数不一致,并非重载
    void DKnuth() override; //无法通过编译,常量性不一致,并非重载
    void Print() override; //无法通过编译,非虚函数重载
    };

    (之前听过,但是没看过结构体重载 ==)

    如果没有使用override关键字,上面的写法编译可以通过但是运行的效果与真实意愿(希望重载)不符
    举例子说明
    class testoverride
    {
    public:
    testoverride(void);
    ~testoverride(void);
    virtual void show() const = 0;
    virtual int infor() = 0;
    virtual void test() = 0;
    virtual int spell() = 0;
    };

    class B: public testoverride
    {
    public:
    virtual void show(); //1
    virtual void infor(); //2
    virtual void vmendd(); //3
    virtual void test(int x);//4
    virtual void splle(); //5
    };

    上面的1-5个重载函数编译过程中,除了返回值不同的infor会报错以外,其他函数都不会有问题,但是在类实例化的时候会提示是抽象类,因为他们都没有真正实现重载

    class C: public testoverride
    {
    public:
    virtual void show() override;
    virtual void infor() override;
    virtual void vmendd() override;
    virtual void test(int x) override;
    virtual void splle() override;
    };

    添加了override以后,会在编译器override修饰符则可以保证编译器辅助地做一些检查,上面的情况无法通过编译

    结论
    如果派生类里面是像重载虚函数 就加上关键字override 这样编译器可以辅助检查是不是正确重载,如果没加这个关键字 也没什么严重的error 只是少了编译器检查的安全性

     1.override 让编译器帮你检查函数是不是虚函数

    struct B{
        virtual void f1(int) const;
        virtual void f2();
        void f3();
    };
    
    struct D1:B{
        virtual void f1(int) const override;//对,在B中能找到可以覆写的f1(int)虚函数
        virtual void f2(int) override;//❌,B中没有可以覆写的f2(int)虚函数
        void f3() override;//错,B中f3不是虚函数
        void f4() override; //错,B中没有f4
    };

    2.final至此后面继承的类不能再覆写了

    struct D2:B{
        void f1(int) const final;//不许后面继承的类覆写此函数了
    };
    struct D3:D2{
        void f2();//正确
        void f1(int) const;//错误,不允许覆写了


    ---------------------
    作者:xiaoheibaqi
    来源:CSDN
    原文:https://blog.csdn.net/xiaoheibaqi/article/details/51272009
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    集合框架总结笔记三
    ANDROID_MARS学习笔记_S03_006_geocoding、HttpClient
    ANDROID_MARS学习笔记_S03_005_Geocoder、AsyncTask
    ANDROID_MARS学习笔记_S03_004_getAllProviders、LOCATIONLISTENER、getBestProvider
    ANDROID_MARS学习笔记_S03_003_LocationManager、LocationListener
    ANDROID_MARS学习笔记_S03_002_设置可见性及扫描蓝牙设备
    ANDROID_MARS学习笔记_S03_001_获取蓝牙匹配列表
    ANDROID_MARS学习笔记_S02_015_Gson解析json串为对象集合
    ANDROID_MARS学习笔记_S02_014_GSON解析JSON串为对象
    ANDROID_MARS学习笔记_S02_013_Gson解析json串
  • 原文地址:https://www.cnblogs.com/yrm1160029237/p/10093406.html
Copyright © 2011-2022 走看看