zoukankan      html  css  js  c++  java
  • c++11 继承控制:final和override

    c++11 继承控制:final和override

    #define _CRT_SECURE_NO_WARNINGS
    
    #include <iostream>
    #include <string>
    #include <vector>
    #include <map>
    
    // C++11之前,一直没有继承控制关键字,禁用一个类的进一步衍生比较麻烦。
    /*
    C++ 11添加了两个继承控制关键字:final和override。
    final阻止类的进一步派生和虚函数的进一步重写
    override确保在派生类中声明的函数跟基类的虚函数有相同的签名
    
    在C++中,只要原来的返回类型是指向类的指针或引用,新的返回类型是指向派生类的指针或引用,覆盖的方法就可以改变返回类型。这样的类型称为协变返回类型(Covariant returns type).
    返回类型的协变(covariance)指返回类型是接口或委托定义返回类型的子类,
    参数类型的逆变(contravariance)是指实现的参数类型是接口或委托定义的参数类型的父类。
    */
    class B1 final {}; // 此类不能被继承
    //class D1: public B1 {}; // error!
    
    class B
    {
    public:
        //  virtual void func() override // error! 指定了重写但实际并没重写,没有基类
        //  {
        //      std::cout << __func__ << std::endl;
        //  }
        virtual void f() const
        {
            std::cout << __func__ << std::endl;
        }
        virtual void fun()
        {
            std::cout << __func__ << std::endl;
        }
    };
    
    class D : public B
    {
    public:
        virtual void f(int)      // ok! 隐藏,由于没有重写同名函数B::f,在D中变为不可见
        {
            std::cout << "hiding: " <<__func__ << std::endl;
        }
        //  virtual void f() override   // error! 指定了重写但实际并没重写,类型声明不完全相同
        //  {
        //      std::cout << __func__ << std::endl;
        //  }
        virtual void fun() override final // ok! 指定了重写实际上也重写了,同时,指定为最终,后代类中不能再重写此虚函数
        {
            std::cout << __func__ << std::endl;
        }
    };
    
    class D2 : public D
    {
    public:
        virtual void f() const      // ok! 重写B::f(),同时,由于没有重写D::f(int),在D2中变不可见
        {
            std::cout << __func__ << std::endl;
        }
        //  virtual void fun() // error! 基类的此虚函数被指定为最终,不能被重写,虽然没有显示指定"override"
        //  {
        //      std::cout << __func__ << std::endl;
        //  }
        //  virtual void fun() override // error! 基类的此虚函数被指定为最终,不能被重写
        //  {
        //      std::cout << __func__ << std::endl;
        //  }
    };
    
    
    void mytest()
    {
    
        return;
    }
    
    
    int main()
    {
        mytest();
    
        system("pause");
        return 0;
    }
  • 相关阅读:
    网站前台性能优化教程
    解决Jboss打开run.bat时闪退不能启动的方法
    如何讲解自己开发的程序
    数据库调优教程汇总
    数据库调优教程(十三) MySQL数据库其他优化方法
    数据库调优教程(十二) 优化sql语句
    数据库调优教程(十一) 设计一张漂亮的表
    数据库调优教程(十) 【精华章节】解决like ’%str’ 时索引不被使用的4种方法
    数据库调优教程(九) 添加了索引但不被使用的几种常见可能
    Redis Cluster 实践
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7787409.html
Copyright © 2011-2022 走看看