C++语言新特性之final override标识符
沉沙 2019-01-02 来源 : 阅读 1704 评论 0

摘要:本篇教程探讨了C++语言新特性之final override标识符,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

C++语言新特性之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;
    }
};    

本文由职坐标整理发布,学习更多的相关知识,请关注职坐标IT知识库!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程