C++11新特性之final override标识符

Stella981
• 阅读 740

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;
    }
};
点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java核心技术36讲笔记
JavaBasic谈谈final、finally、finalize有什么不同?典型回答:final可以用来修饰类、方法、变量,分别有不同的意义,final修饰的class代表不可以继承扩展,final的变量是不可以修改的,而final的方法也是不可以重写的(override)。finally则是
Wesley13 Wesley13
3年前
java常用的关键字
1、final关键字final关键字可用于修饰类、方法以及变量。修饰类:该类不能被继承,该类的所有方法和成员都被隐式地指定为final。修饰方法:锁定方法,任何继承类都不能修改他,所有的private方法都被隐式地指定为final方法。修饰变量:若修饰的变量为基本数据类型,该变量值被赋值后不可改变;若修饰的变量为引用类型的变量,该变量
Wesley13 Wesley13
3年前
Java 入门学习知识点整理
\JAVA一个文件写多个类(同级类)规则和注意点\在一个.java文件中可以有多个同级类, 其修饰符只可以public/abstract/final/和无修饰符public修饰的只能有一个,且必须要与文件名相同
Wesley13 Wesley13
3年前
Java中static、final、static final的区别
说明:不一定准确,但是最快理解。final:final可以修饰:属性,方法,类,局部变量(方法中的变量)final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变。final修饰的属性跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值。final修饰的属性表明是一个常数(创建后不能被修改)。
Stella981 Stella981
3年前
BATJ的常见java面试题
JAVA基础1.JAVA中的几种基本数据类型是什么,各自占用多少字节。2.String类能被继承吗,为什么。不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。3.String,Stringbuffer,StringBuilder的区别。String字符串常量StringBuffer
Wesley13 Wesley13
3年前
Java深究之final、finally、finalize三者的区别
       在java中final、finally、finalize三者在写法上很相近,但是实际含义和作用却是相差甚远。本文主要是来深层的研究下这三者的用法以及之间的区别1.final属性:java中的关键字,修饰符作用:用于修饰类、成员方法、变量(成员变量、局部变量)用法:如果类被声明为final,那么该类就不能再派生出新的子类
Wesley13 Wesley13
3年前
Java基础入门
类别关键字说明访问控制private私有的protected受保护的public公共的类、方法和变量修饰符abstract声明抽象class类extends扩充,继承final最终值,不可改变的implements实现(接口)interface接口native本地
Wesley13 Wesley13
3年前
Java修饰符类型
修饰符是一种添加到定义以更改其含义的关键字。Java语言有各种各样的修饰符,包括以下两种Java访问修饰符例如:private,protected,public等。Java非访问修饰符例如:static,final等。要使用修饰符,请在类,方法或变量的定义中包含修饰符关键字。修饰符位于语句之前,
Wesley13 Wesley13
3年前
Java 语言的类、属性、方法各有哪些修饰符?简述各修饰符的区别
1、类的修饰符分为:可访问控制符和非访问控制符两种。可访问控制符是:公共类修饰符public非访问控制符有:抽象类修饰符abstract;最终类修饰符final     1、公共类修饰符public:Java语言中类的可访问控制符只有一个:public即公共的。每个Java程序的主类都必须是public类作为公共工