设置一个不能被继承的类

news2024/11/28 22:36:37

小屋杂谈,记录日常

方法1:

如果想让这个类不能被继承,可以把这个类的构造函数设置成私有,这样子类去继承他构造就会报错,这样的话这个类就是不能被继承的,如果需要用这个类的对象的话,在基类里写个静态函数,内部实现new个对象,返回他的指针就行

(不推荐!)只能局限在堆上去构建这个对象,在栈上不行

代码示例

方法2:

(推荐回答的版本!)

想让这个类不能被继承,我们可以让这个类去虚继承一个父类(这个父类可以是任意的一个辅助的类),这个辅助的父类构造函数设置成private,然后让这个类去作为辅助父类的友元

这个时候你让一个子类去继承刚刚完成的这个类,用子类去构建对象就会失败了。因此说这个类是不能被继承的

讲一下依据:

  1. 派生类不能去调用父类的private属性的构造函数
  2. 建立一个对象时,如果这个对象中含有从虚基类继承来的成员,则虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。
  3. 意思就是辅助类A的构造为私有,B虚继承A类,且B是A的友元,友元的话B就可以访问A的私有属性,因此B去栈上或者堆上去构建自己的对象都是可以的;而因为友元不能被继承下去,所以C类去继承B的时候,这个友元没有被继承下去,C类并不是A的友元,又因为B类是虚继承A类的,所以C在构建对象的时候直接跳到A类去调用A类的构造,因为A类的构造是私有属性,所以C构建对象就会失败。
  4. 这样的爷->父->子,一串就说明了父亲这个类是不能被继承的,要是被继承了,儿子就没法去构建对象了

代码模板:

template<typename T>
class A 
{
	friend T;//注意这里不需要class关键字  B是A的友元
private:
	A() {}
	~A(){}

};
class B :virtual public A<B>//虚继承A
{
public:
	B(){}
	~B(){}
};
class C:public B
{

};

int main()
{
	B b;//栈上
	B *bb = new B();//堆上
	
	C c;//出错了就会 // 基类构造函数私有,不可以被继承。因此不可以创建栈上对象
}

 不理解虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的戳下面

 虚基类及其派生类的构造函数_

方法3:

c++11引入关键字final用来标识虚函数不能在子类中被覆盖(override),或一个类不能被继承

class A final
{
private:
	A() {}
};
class B :public A
{

};


class A 
{
public:
	A() {}
	virtual void fun()final{
		cout << "A fun" << endl;
	}
};
class B :public A
{
public:
	void fun() {
		cout << "B fun" << endl;
	}
};


看完上面的就能回答下面这个问题了

如何实例化构造函数是private属性的类?
只要有一个函数能够访问private成员就行了。这个就有两种方法。
一是,在类中定义一个static 成员函数。
二是,在类中定义一个friend成员。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/41696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习中的交叉熵

文章目录一、背景二、概率论基础知识三、熵≈信息熵&#xff08;应用领域不同&#xff09;、相对熵KL散度、交叉熵、softmax、sigmoid、交叉熵损失图像分割如何理解CrossEntropyLoss()参考资料一、背景 学习机器学习过程中&#xff0c;总是会遇到交叉熵这个名词。通过交叉熵损…

SpringBoot整合knife4j

1.1 Swagger 前后端分离开发&#xff1a;前端和后端分开进行开发&#xff0c;2个项目&#xff0c;一个是前端项目&#xff0c;一个是后端项目 目前基本上很多小项目都是前后端分离&#xff0c;除了后台管理系统 前后端分离开发&#xff0c;前端(app、小程序、智能硬件等)怎么…

栈(C语言实现)

文章目录&#xff1a;1.栈的概念2.栈的结构3.接口实现3.1初始化栈3.2判断栈是否为空3.3压栈&#xff08;入栈&#xff09;3.4出栈3.5查看栈顶元素3.6统计栈内元素个数3.7销毁栈1.栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操…

Credly 数字证书

Credly 数字证书 Credly 简介 通过 Credly 颁发的徽章是对学习成果、经验或能力的数字表述。Credly 数字证书包括常见的组织徽章&#xff0c;如&#xff1a;AWS, Adobe, Autodesk, Certiport, Microsoft, CISCO, IBM 等等&#xff0c;以一种简单和安全的方式在线分享和验证&a…

基于改进人工蜂群算法的K均值聚类算法(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

基于SEIRD和元胞自动机(CA)模型的传染病发展趋势预测

目录前言一、模型假设二、符号说明三、SEIRD模型1. 模型求解四、元胞自动机&#xff08;CA)模型1. 模型求解2. 城市居民减少外出对疫情发展的影响3. 城市间人口流动对疫情发展的影响五 基于防疫政策的修正模型2 “全民戴口罩”“早发现&#xff0c;早隔离”“全民打疫苗”总结前…

Jsonp跨域的坑,关于jsonp你真的了解吗

先来介绍Jsonp跨域 Jsonp全称是Json with Padding&#xff0c;和Json没有关系 Json是一种数据交换格式&#xff0c;而Jsonp是一种依靠开发人员聪明才智创造出的一种费官方跨域数据交换协议。json是描述信息的格式&#xff0c;jsonp是信息传输的协议 在页面上直接发送一个跨域的…

树莓派之树莓派系统安装

树莓派系统安装 概述 树莓派(是为学习计算机编程教育而设计)&#xff0c;只有信用卡大小的微型电脑&#xff0c;其系统基于Linux。随着Windows 10 IoT的发布&#xff0c;我们也将可以用上运行Windows的树莓派。2014年刚知道有树莓派的时候好奇买了一块&#xff0c;型号&#x…

DSP-IIR滤波器设计

目录 滤波器的性能指标&#xff1a; 常用的模拟滤波器&#xff1a; 巴特沃斯滤波器&#xff1a; 巴特沃斯滤波器设计——一般已知Ωp及其衰减指标,Ωs及其衰减指标求得A&#xff0c;ε&#xff0c;N&#xff0c;Ωc&#xff1a; 巴特沃斯滤波器设计例题&#xff1a; 切比…

Python系列-Django

文章目录Python系列-Django用django实现社交媒体 social_book基本演示&#xff0c;点击可查看视频整体项目的创建数据库设计&#xff0c;基本用户创建表的设计 models.py创建用户查看数据库插件 database navigator登录、注册的实现用djangovue实现社交媒体 social_bookPython系…

【Java集合】Collection接口常用方法

文章目录Collection接口和常用方法> Collection接口常用方法> Collection接口遍历元素&#xff1a;使用Iterator&#xff08;迭代器&#xff09;> Collection接口遍历元素&#xff1a;增强 for 循环Collection接口和常用方法 Collection接口实现类的特点&#xff1a;…

CPU中的核与进程,线程间的关系讲解(操作系统基础概念)

CPU中的核与进程&#xff0c;线程间的关系讲解&#xff08;操作系统基础概念&#xff09; CPU中的内核 概念 CPU内核&#xff08;Die&#xff09;是CPU中间的核心芯片&#xff0c;由单晶硅制成&#xff0c;用来完成所有的计算、接受/存储命令、处理数据等&#xff0c;是数字…

Node.js | 详解 JWT 登录验证 的工作原理

&#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; &#x1f5a5;️ 本系列专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ TS知识总结&#xff1a;十万字超详细TS知识点总结 &#x1f449; 你的一键三连是我更新的最大动力❤️&…

【Java系列】一篇文章快速了解Java语言概述

Java语言概述1.Java简介2.JVM2.1JVM介绍2.2JVM特性3.Java特性4.搭建Java程序开发环境5.编写第一个Java应用程序6.小结第一个程序1.Java简介 java是面向对象的一门程序设计语言随着Java技术在web方面的不断成熟&#xff0c;已经成为Web应用程序的首选开发语言。后台开发&#x…

FRP进阶篇之安全认证

目录 一、前言 二、通信加密 1、概述 2、使用 三、BasicAuth 鉴权 1、概述 2、使用 2.1、客户端配置 2.2、启动客户端 2.3、效果验证 四、TLS双向身份验证 1、概述 2、使用 2.1、生成证书 2.2、服务端配置 2.3、客户端配置 一、前言 通过上次的《FRP入门篇》相信…

毕业设计-机器学习图像卡通动漫化图像风格迁移

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投…

关于旅游景点主题的HTML网页设计——北京景点 7页(带订单购物车)Html+Css+javascript

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 游景点介绍 | 旅游风景区 | 家乡介绍 | 等网站的设计与制作 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 CSS&…

redhat 新开启一个ssh端口

查看是否安装ssh服务 rpm -qa |grep ssh2.开启ssh服务 systemctl start sshd.service3.修改ssh配置文件 vi /etc/ssh/sshd_config4.复制Port行并修改端口号 此时已经新增了一个端口 5.启用新端口 sudo semanage port -a -t ssh_port_t -p tcp 22116.防火墙放开新增的端口 …

最全面的SpringMVC教程(二)——SpringMVC核心技术篇

前言 本文为 【SpringMVC教程】核心技术篇 相关详细介绍&#xff0c;具体将对视图和模型拆分&#xff0c;重定向与转发&#xff0c;RequestMapping与其衍生注解&#xff0c;URL 模式匹配&#xff0c;牛逼的传参&#xff0c;设定字符集&#xff0c;返回json数据&#xff08;序列…

【Hack The Box】linux练习-- seal

HTB 学习笔记 【Hack The Box】linux练习-- seal &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f36d…