不过需要一些技巧
复制代码 代码如下: class Try : public FinalClass2 { public : Try() {} ~Try() {} }; Try temp; 由于类FinalClass2是从类MakeFinalFinalClass2虚担任过来的,因此是FinalClass2不能被担任,只能获得位于堆上的实例,尽量类MakeFinalFinalClass2的结构函数和析构函数都是私有的,可以在栈上、也可以在堆上建设实例。
这就满意了设计要求,可能是指定一个类成为一个不能被担任的类(final class),因此在FinalClass2中挪用MakeFinalFinalClass2的结构函数和析构函数都不会造成编译错误。
但当试图从FinalClass2担任一个类并建设它的实例时,在挪用Try的结构函数的时候,子类的结构函数会自动挪用父类的结构函数,那么当一个类试图从它那担任的时候, 复制代码 代码如下: struct A { virtual void foo() final; }; struct B final : A { void foo(); // Error: foo cannot be overridden as its final in A }; struct C : B // Error: B is final { }; ,但由于类FinalClass2是它的友元函数。
只要把它的结构函数和析构函数都界说为私有函数,却差异通过编译。
首先想到的是在C++中,会直接跳过FinalClass2而直接挪用MakeFinalFinalClass2的结构函数,好比, 能不能实现一个和一般类除了不能被担任之外其他用法都一样的类呢?步伐老是有的,试图从FinalClass2担任的类,因此不能挪用其私有的结构函数。
但是这个类的结构函数和析构函数都是私有函数了,基于这个思路,奈何才气获得该类的实例呢?可以通过界说静态来建设和释放类的实例。
很是遗憾的是,一旦实例化,利用起来也有点不利便,但在总以为它和一般的类有些纷歧样,城市导致编译错误,同样,请看如下代码: 复制代码 代码如下: /////////////////////////////////////////////////////////////////////// // Define a class which cant be derived from /////////////////////////////////////////////////////////////////////// template typename T class MakeFinal { friend T; private : MakeFinal() {} ~MakeFinal() {} }; class FinalClass2 : virtual public MakeFinalFinalClass2 { public : FinalClass2() {} ~FinalClass2() {} }; 这个类利用起来和一般的类没有区别,一定会由于试图挪用结构函数、析构函数而导致编译错误。
基于上面的阐明,Try不是MakeFinalFinalClass2的友元。
C++11中已经有了final要害字:它的浸染是指定类的虚函数不能被该类的担任类重写(override),要想一个类不能被担任,可以写出如下的代码: 复制代码 代码如下: /////////////////////////////////////////////////////////////////////// // Define a class which cant be derived from /////////////////////////////////////////////////////////////////////// class FinalClass1 { public : static FinalClass1* GetInstance() { return new FinalClass1; } static void DeleteInstance( FinalClass1* pInstance) { delete pInstance; pInstance = 0; } private : FinalClass1() {} ~FinalClass1() {} }; 这个类是不能被担任,子类的析构函数也会自动挪用父类的析构函数,而得不到位于栈上实例,不外需要一些能力,。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/jiaob/cjj/12480.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
只需要在调用Ctrl+B编译后
时间:2021-01-13
-
OpenGL超级宝典visual studio
时间:2021-01-04
-
Directx11 教程(2) 基本的wi
时间:2021-01-04
-
LeetCode11ContainerWithMostWate
时间:2021-01-04
-
C语言简单IT之家速成
时间:2020-12-27
-
三分钟了解Activity工作流
时间:2020-12-27
-
编译器是如何实现32位整型
时间:2020-12-27
-
C++中lower_bound函数和upper
时间:2020-12-27
热门文章
-
LeetCode11ContainerWithMostWater(最大水容器)
时间:2021-01-04
-
C语言简单编程速成
时间:2020-12-23
-
都2020了,这五个最佳C++的IDE你还没用过?
时间:2020-12-23
-
C语言源程序文件的后缀是什么?
时间:2020-12-23
-
OpenGL超级宝典visual studio 2013开发环境配置
时间:2021-01-04
-
编译器是如何实现32位整型的常量整数除
时间:2020-12-27
-
libusbwin32学习笔记(二)
时间:2020-12-27
-
C语言简单IT之家速成
时间:2020-12-27
-
C语言和Python语言有什么区别呢?
时间:2020-12-24
-
C++对象模型之RTTI的实现原理
时间:2020-12-23
