• C++ final用法简介


    1: final作用于类名之后,表示这个类不能被继承,

    如下代码:

    #include 
    using namespace std;
    class A13 {
    public:
    	A13() {
    		cout << "default constructor" << endl;
    	}
    	int say()  {
    		cout << "say" << endl;
    		return  0;
    	}
    };
    
    class B: public A13 {
    };
    
    int main() {
    	B *b = new B();
    	b->say();
    	delete  b;
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    B 继承A ,编译以及运行都正常。
    如果我们现在把第三行由:

     class A13 {
    
    • 1

    修改为

    class A13 final {
    
    • 1

    编译错误如下:

    cpp13.cpp:15:7: error: cannot derive from ‘final’ base ‘A13’ in derived type ‘B’
       15 | class B: public A13 {
          |       ^
    
    
    • 1
    • 2
    • 3
    • 4

    由于 class A13 之后有加 final ,表明这个类不能被继承,所以编译报错。

    最终全部代码如下:

    #include 
    using namespace std;
    class A13 final {
    public:
    	A13() {
    		cout << "default constructor" << endl;
    	}
    	int say()  {
    		cout << "say" << endl;
    		return  0;
    	}
    };
    
    class B: public A13 {
    };
    
    int main() {
    	B *b = new B();
    	b->say();
    	delete  b;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    2:final作用于一个类的虚函数之后,表示这个方法不能被子类重写:

    如下代码B14继承A14,编译运行都正常,

    #include 
    using namespace std;
    
    class A14 {
    public:
    	A14() {
    		cout << "default constructor A14" << endl;
    	}
    	virtual int say()   {
    		cout << "A say" << endl;
    		return  0;
    	}
    };
    
    
    class B14: public A14 {
    public:
    	 int say()   {
    			cout << "B say" << endl;
    			return  0;
    		}
    
    };
    
    int main() {
    	B14 *b = new B14();
    	b->say();
    	delete  b;
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    如果我们将虚函数

    virtual int say() 
    
    • 1

    后面加 final:

    virtual int say() final  {
    
    • 1

    则编译错误如下:

    cpp14.cpp:18:14: error: virtual function ‘virtual int B14::say()’ overriding final function
       18 |          int say()   {
          |              ^~~
    cpp14.cpp:9:21: note: overridden function is ‘virtual int A14::say()9 |         virtual int say() final  {
          |                     ^~~
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    表明虚函数加final 之后不能被覆盖重写。

    最终的完整代码如下:

    #include 
    using namespace std;
    
    class A14 {
    public:
    	A14() {
    		cout << "default constructor A14" << endl;
    	}
    	virtual int say() final  {
    		cout << "A say" << endl;
    		return  0;
    	}
    };
    
    
    class B14: public A14 {
    public:
    	 int say()   {
    			cout << "B say" << endl;
    			return  0;
    		}
    
    };
    
    int main() {
    	B14 *b = new B14();
    	b->say();
    	delete  b;
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    当然一个非虚函数加final 也编译报错,final用在函数上的时候,只能用在虚函数上。

  • 相关阅读:
    Springboot+vue的学生成绩管理系统(有报告),Javaee项目,springboot vue前后端分离项目。
    MySQL中如何随机获取一条记录
    thinkPHP基于php的枣院二手图书交易系统--php-计算机毕业设计
    java--Lambda (3)变量的访问与修改
    Java之Applet 使用 AudioClip接口播放音频学习笔记
    请求被中止: 未能创建 SSL/TLS 安全通道
    机器学习__03__机器学习之线性回归
    PAT.1143 Lowest Common Ancestor
    k8s+springcloud+nacos部署配置
    vue集成钉钉单点登录
  • 原文地址:https://blog.csdn.net/oHeHui1/article/details/127133745