• C++11 之 override


    override 关键字

    作用:在成员函数声明或定义中, override 确保该函数为虚函数并覆写来自基类的虚函数。
    位置:函数调用运算符之后,函数体或纯虚函数标识 “= 0” 之前。

    使用以后有以下好处:
    1.可以当注释用,方便阅读.
    2.告诉阅读你代码的人,这是方法的复写.
    3.编译器可以给你验证 override 对应的方法名是否是你父类中所有的,如果没有则报错.

    override 使用举例

    如果你想重写父类的方法,比如toString()方法:

    正确的是:

    public String toString() override {
    	...
    }
    

    假如不小心把方法名写错了而没写 override ,这时编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法。如:

    // 注意这里的小写方法,实际上是错误的。
    public String tostring() {...}
    
    

    相反,如果你很机智,在知道自己要重写父类的方法,加上了 override 标签后,编译器会检查出重写方法错误,会保证你重写父类方法的正确性。

    #include <memory>
    #include <iostream>
    using namespace std; 
    class Base
    {
    public:
                virtual void foo();
    };
    void Base::foo()
    {
            cout << "Base::foo" <<endl;
    }
     
    class Derived : public  Base
    {
                void foo() override; // OK: Derived::foo overrides Base::foo
    };
    void Derived::foo()
    {
            cout << "Derived::foo" <<endl;
    }
    int main()
    {
            Base * b = new Derived();
            b->foo();
            return 0;
    } 
    root@ubuntu:~/c++# g++ -std=c++11  over.cpp -o over
    root@ubuntu:~/c++# ./over
    Derived::foo

    非虚函数

    #include <memory>
    #include <iostream>
    using namespace std;
    class Base
    {
    public:
                //virtual void foo();
                void foo();
    };
    void Base::foo()
    {
            cout << "Base::foo" <<endl;
    }
    
    class Derived : public  Base
    {
                void foo() override; // OK: Derived::foo overrides Base::foo
    };
    void Derived::foo()
    {
            cout << "Derived::foo" <<endl;
    }
    int main()
    {
            Base * b = new Derived();
            b->foo();
            return 0;
    }
    over.cpp:17:11: error: ‘void Derived::foo()’ marked ‘override’, but does not override
          void foo() override; // OK: Derived::foo overrides Base::foo
               ^
    #include <memory>
    #include <iostream>
    using namespace std; 
    class Base
    {
    public:
                virtual void foo();
    };
    void Base::foo()
    {
            cout << "Base::foo" <<endl;
    }
     
    class Derived : public  Base
    {
                void foo(int a) override; // OK: Derived::foo overrides Base::foo
    };
    void Derived::foo(int a)
    {
            cout << "Derived::foo" <<endl;
    }
    int main()
    {
            Base * b = new Derived();
            b->foo(3);
            return 0;
    } 
    root@ubuntu:~/c++# g++ -std=c++11  over.cpp -o over
    over.cpp:16:11: error: ‘void Derived::foo(int)’ marked ‘override’, but does not override
          void foo(int a) override; // OK: Derived::foo overrides Base::foo
               ^
    over.cpp: In function ‘int main()’:
    over.cpp:25:10: error: no matching function for call to ‘Base::foo(int)’
      b->foo(3);
              ^
    over.cpp:9:6: note: candidate: virtual void Base::foo()
     void Base::foo()
          ^
    over.cpp:9:6: note:   candidate expects 0 arguments, 1 provided
    #include <memory>
    #include <iostream>
    using namespace std;
    class Base
    {
    public:
                virtual void foo();
    };
    void Base::foo()
    {
            cout << "Base::foo" <<endl;
    }
    
    class Derived : public  Base
    {
                void foo() ; // OK: Derived::foo overrides Base::foo
                //void foo() override; // OK: Derived::foo overrides Base::foo
    };
    //void Derived::foo(int a)
    //{
    //      cout << "Derived::foo" <<endl;
    //}
    int main()
    {
            Base * b = new Derived();
            b->foo();
            return 0;
    }
    root@ubuntu:~/c++# g++ -std=c++11  over.cpp -o over
    /tmp/cc9ksedx.o: In function `Derived::Derived()':
    over.cpp:(.text._ZN7DerivedC2Ev[_ZN7DerivedC5Ev]+0x14): undefined reference to `vtable for Derived'
    over.cpp:(.text._ZN7DerivedC2Ev[_ZN7DerivedC5Ev]+0x18): undefined reference to `vtable for Derived'
    collect2: error: ld returned 1 exit status
    #include <memory>
    #include <iostream>
    using namespace std;
    class Base
    {
    public:
                virtual void foo();
    };
    void Base::foo()
    {
            cout << "Base::foo" <<endl;
    }
    
    class Derived : public  Base
    {
               void Foo() override; // OK: Derived::foo overrides Base::foo
    };
    //void Derived::foo(int a)
    //{
    //      cout << "Derived::foo" <<endl;
    //}
    int main()
    {
            Base * b = new Derived();
            //b->foo();
            return 0;
    }
    root@ubuntu:~/c++# g++ -std=c++11  over.cpp -o over
    over.cpp:16:10: error: ‘void Derived::Foo()’ marked ‘override’, but does not override
         void Foo() override; // OK: Derived::foo overrides Base::foo
              ^
    root@ubuntu:~/c++#
  • 相关阅读:
    技术分享:unity3d基础问题
    转载》【3个免费名额】爱加密TFC大会15万手游保护服务免费送!速来报名!
    Android APP通用型拒绝服务、漏洞分析报告
    493万Gmail用户的账号密码遭泄露,疑从其他网站数据库提炼而成
    转载:在 android dialog中使用Autocompletetext
    转载 iOS工程适配64-bit 经验分享
    爱加密联合应用之星(APPSTAR)为开发者提供免费云加密服务
    魔学院_部门课程笔记1_LoadRunner性能测试
    Jmeter学习笔记12-监听器以及测试结果的分析
    Jmeter学习笔记11-分布式性能测试
  • 原文地址:https://www.cnblogs.com/dream397/p/14607821.html
Copyright © 2020-2023  润新知