zoukankan      html  css  js  c++  java
  • C++11新特性之final override标识符

    final:

      final修饰符可用于修饰类,放在类名后面,被final修饰符修饰的类不能被继承。示例代码:

    // 正确的示范
    #include <iostream>
    
    class A
    {
    public:
        void show_a_info()
        {
            std::cout << "i am class A" << std::endl;
        }
    };
    
    class B : public A
    {
    public:
        void show_b_info()
        {
            std::cout << "i am class B" << std::endl;
        }
    };
    
    int main()
    {
        B b;
        b.show_a_info();
        b.show_b_info();
        return 0;
    }
    
    // 输出:
    // i am class A
    // i am class B
    // 错误的示范
    #include <iostream>
    
    class A final
    {
    public:
        void show_a_info()
        {
            std::cout << "i am class A" << std::endl;
        }
    };
    
    class B : public A
    {
    public:
        void show_b_info()
        {
            std::cout << "i am class B" << std::endl;
        }
    };
    
    int main()
    {
        B b;
        b.show_a_info();
        b.show_b_info();
        return 0;
    }
    
    // 编译报错:错误    2    error C3246: “B”: 无法从“A”继承,因为它已被声明为"final"

      final修饰符还可用于修饰类中的成员函数,但是成员函数必须是虚函数,被final修饰符修饰的虚函数在子类中不可以被重写。示例代码如下:

    // 正确的示范
    #include <iostream>
    
    class A
    {
    public:
        virtual void show_info()
        {
            std::cout << "i am class A" << std::endl;
        }
    
        virtual void test_final() final
        {
            return;
        }
    };
    
    class B : public A
    {
    public:
        void show_info()    // 可以被重写
        {
            std::cout << "i am class B" << std::endl;
        }
    
        void test_final()    // 编译报错:A::test_final声明为final的函数无法被B::test_final重写
        {
            int count = 0;
            // do_something()
            return;
        }
    };
    
    int main()
    {
        A *a_ptr = new B();
        a_ptr->show_info();
        return 0;
    }

     override:

      在C++11之前,在父类中用virtual声明一个虚函数,在子类中进行重写时,可以省略virtual修饰符,但是子类中重写的函数就算省略了virtual修饰符,它依然是个虚函数,当我们阅读代码时,子类中的这个函数由于没有virtual修饰符修饰,我们不去看父类的定义并不会知道在子类中这是一个虚函数,为了解决可读性问题,我们可以在子类中也加上virtual修饰符,但也同样会带来如下代码中的问题:

    class A
    {
    public:
        virtual void show_info(int x)
        {
            std::cout << "i am class A" << std::endl;
        }
    };
    
    class B : public A
    {
    public:
        virtual void show_info(float x)
        {
            std::cout << "i am class B" << std::endl;
        }
    };

      本意是想重写父类中的show_info(int x)函数,但是写成了show_info(float x),这样写就已经不是重写了,而是变成了重载。为了解决可读性及这种重写被不小心写成重载的问题,在C++11中当我们想重写父类的虚函数时,可以在子类中重写的虚函数后面加上override修饰符,这样既标识在子类中这是在重写父类中的虚函数,同时也可以防止重写被误写为重载,因为当子类中对应的函数声明和父类中不一致时,是编译不过的,示例如下:

    // 正确的示范
    #include <iostream>
    
    class A
    {
    public:
        virtual void show_info(int x)
        {
            std::cout << "i am class A" << std::endl;
        }
    };
    
    class B : public A
    {
    public:
        //virtual void show_info(float a) override    // 错误error C3668: “B::show_info”: 包含重写说明符“override”的方法没有重写任何基类方法
        //{
        //    std::cout << "i am class B" << std::endl;
        //}
    
        virtual void show_info(int a) override        // 正确
        {
            std::cout << "i am class B" << std::endl;
        }
    };
  • 相关阅读:
    vi编辑器
    数据发送的三种方式
    发送文件的三种方式
    提交表单提示框确定取消 点取消不会刷新页面
    input value="值栈的值"
    值栈
    struts2文件上传突破2M限制
    jsp取不到值栈的值
    站群--插件--点击量
    Java WebService 简单实例
  • 原文地址:https://www.cnblogs.com/418ks/p/10134712.html
Copyright © 2011-2022 走看看