带虚函数的类的sizeof分析

一个类中若有虚函数,(不论是自己的虚函数,还是继承而来的),那么类中就有一个成员变量:虚函数指针。虚函数指针占4字节

直接看例子:

class base1{
private:int a;
public:virtual void fun1(){}virtual void fun2(){}
};class base2{
public:virtual void fun1(){}virtual void fun2(){}
};int main(){cout << sizeof(base1) << endl;  //8cout << sizeof(base2) << endl;  //4return 0;
}

如果子类继承基类,子类会继承虚函数表,不管子类有没有对虚函数重写,子类都会有虚函数指针:

class base1{
public:virtual void fun1(){}virtual void fun2(){}
};class derive1 :public base1{
public:virtual void fun1(){}virtual void fun2(){}
};class derive3 :public base1{
public:void fun6(){}void fun7(){}
};int main(){cout << sizeof(derive1) << endl;  //4cout << sizeof(derive3) << endl;  //4return 0;
}

如果一个子类继承自2个基类,那么子类有2个虚函数指针,所以sizeof大小为 8:

class base1{
public:virtual void fun1(){}virtual void fun2(){}
};class base2{
public:virtual void fun3(){}virtual void fun4(){}
};class derive2 :public base1,public base2{
public:virtual void fun1(){}virtual void fun2(){}virtual void fun3(){}virtual void fun4(){}
};int main(){cout << sizeof(derive2) << endl;  //8return 0;
}

如果基类没有虚函数,子类继承基类后把其中一个函数设为虚函数,则基类没有虚表指针,子类有虚表指针:

class base{
private:int a;  //整型4字节
public:void fun1(){}
};class derive :public base{
public:virtual void fun1(){}
};int main(){derive d1;cout << sizeof(base) << endl;  //4字节,整型大小cout << sizeof(d1) << endl;  //8字节,整型+虚表指针return 0;
}

 

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

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

相关文章

大脑通过统计推理表征“自我”

来源&#xff1a; 脑智卓越中心9月3日&#xff0c;《美国科学院院刊》在线发表了题为《猕猴对自我身体表征的统计推理》的研究论文。该研究由中国科学院脑科学与智能技术卓越创新中心&#xff08;神经科学研究所&#xff09;、上海脑科学与类脑研究中心、灵长类神经生物学重点实…

java 获取当前classpath的绝对路径

/* * URI:绝对路径 */ System.out.println("当前类ReadTest.class文件的URI\n" ReadTest.class.getResource("")); System.out.println("当前classpath的URI\n" ReadTest.class.getResource("/")); System.out.println("…

python压缩教程_Python压缩模块zipfile实现原理及用法解析

一、python压缩模块简介python直接通过内置压缩模块可以直接进行压缩文件的创建&#xff1b;内置模块 zipfile/rarfile 完成压缩文件的操作。二、 zipfile模块基础使用2.1 对一个文件进行zip压缩# 把当前目录的test.txt文件压缩到a.zip压缩包中import zipfilef zipfile.ZipFil…

关于未来50年的工作与生活,三星联合未来学家们做出了这些预测

来源&#xff1a;资本实验室8月底&#xff0c;三星公司为庆祝其位于伦敦的新体验空间Samsung KX投入运营&#xff0c;委托英国的几位专家学者和未来学家们共同研究&#xff0c;并发布了一份题为《三星KX50&#xff1a;聚焦未来》的报告。根据该报告的预测&#xff0c;到2069年&…

C++ 多继承中的多义性

如果一个子类继承多个基类&#xff0c;这多个基类都有一个相同的函数&#xff0c;那么子类调用这个相同的函数就会产生多义性&#xff0c;编译就不能通过&#xff1a; class base1{ public:virtual void fun1(){ cout << "1" << endl; } }; class base2…

Samba Linux 和windows 共享

1.安装Samba (yum install Samba) 2.配置Samba &#xff08;Samba的配置文件为/etc/samba/smb.conf&#xff09; 1&#xff09;打开smb.conf vim /etc/samba/smb.conf 2)将文件中的内容做如下相应修改&#xff1a;    #securityuser 后面添加&#xff1a; secur…

python文本字符串比对_python-模糊字符串比较

python-模糊字符串比较我正在努力完成的是一个程序&#xff0c;该程序读取文件并根据原始句子比较每个句子。 与原始句子完全匹配的句子将得到1分&#xff0c;而与之相反的句子将得到0分。所有其他模糊句子将得到1到0分之间的分数。我不确定要使用哪种操作在Python 3中完成此操…

C++判断字符是字母或数字

判断字符是字母&#xff1a;isalpha() 判断字符是数字&#xff1a;isdigit() 判断字符是字母或数字&#xff1a;isalnum()

获取版本号

-(NSString*)version; { NSDictionary *infoDictionary [[NSBundle mainBundle] infoDictionary]; CFShow((__bridge CFTypeRef)(infoDictionary)); // app版本 NSString *app_Version [infoDictionary objectForKey:"CFBundleShortVersionString"]; return app_Ve…

深度!全球机器人产业趋势及特征分析

来源&#xff1a;AI城市智库当前&#xff0c;全球机器人市场规模持续扩大&#xff0c;工业机器人市场增速回落&#xff0c;服务、特种机器人增速稳定。技术创新围绕仿生结构、人工智能和人机协作不断深入&#xff0c;产品在教育陪护、医疗康复、危险环境等领域的应用持续拓展&a…

设计代码说明什么是多态性?如何实现多态?(代码中要写注释解释)_狗屎一样的代码!快,重构我...

关注后你就是我的人了重构不止是代码整理&#xff0c;它提供了一种高效且受控的代码整理技术。&#xff08;一&#xff09;重构原则1、何谓重构对软件内部结构的一种调整&#xff0c;目的是在不改变软件可观察行为的前提下&#xff0c;提高其可理解性&#xff0c;降低其修改成本…

C++字母转大小写

大小写字母转化&#xff1a; 转化为大写&#xff1a;toupper() 转化为小写&#xff1a;tolower()

影响国家安全的四项新兴技术

来源&#xff1a;《Technology and National Security: Maintaining Americas Edge》The Aspen Institute (2019年1月31日)本文节选自专著《Technology and National Security: Maintaining Americas Edge》&#xff0c;本文部分讨论了四种新兴技术&#xff1a;生物技术、小型卫…

中小学生学python_《中小学生Python编程入门指南》 附录一

我们怎么看懂二进制的大小呢&#xff1f;换句话说&#xff0c;二进制怎么转化成十进制来理解呢&#xff1f;举个例子&#xff0c;比如说有一个8位的二进制数“01011011”如下&#xff0c;转换为十进制的&#xff0c;应该怎么转化&#xff1f;二进制数的每一位数都是2的几次幂&a…

Expected tensor for argument #1 ‘input‘ to have the same device as tensor for argument #2 ‘weight‘;

这种情况出现的原因之一是创建网络的语句没有放进train函数里 比如主文件中有train&#xff08;&#xff09;&#xff0c;test&#xff08;&#xff09;&#xff0c;eval&#xff08;&#xff09;......等各个函数&#xff0c;但是创建网络的语句&#xff1a;netcreatenet()放…

单例在多线程中的使用

一次执行 dispatch_once: 对应的代码只执行一次 , 并且它是线程安全的, 系统会自动这个函数加锁,保存同一时间只有一个线程去执行任务, 实现真正意义的一次性执行 什么时候需要用到一次性执行: 单例 单例: 就是在程序运行期间,只有一个实例化对象 ---- 举例:音乐播放器的App…

找到一个或多个多重定义的符号_初中数学之相反数,总结规律,学会多重符号的化简...

今天继续和大家一起来学习初中数学&#xff0c;初一的相关知识&#xff0c;在前面已经介绍了正数和负数&#xff0c;对于有理数也有了清楚的认识&#xff0c;今天我们来学习相反数&#xff0c;相反数的概念和表示是中考命题的热点之一&#xff0c;经常结合其他知识点一起考察&a…

分类分布(categorical分布)

解释&#xff1a; 假设X有3种状态&#xff0c;分别为x_1,x_2,x_3&#xff0c;这三种状态的概率分别为0.1,0.7,0.2&#xff08;分别对应θ_1,θ_2,θ_3&#xff09; 例如现在要求x_2这种状态的概率&#xff0c;则x_10,x_21,x_30 代入公式&#xff1a; θ_1^x_1θ_1^01; θ_…

SQL Server XML转Table

前言   在SQL Server中有时候我们需要传人一个Table过去&#xff0c;然后可以在存储过程中批量更新&#xff0c;批量的获取相应数据。 但存储过程的参数是固定&#xff0c;所以这里我们可以变通的传人xml类型的参数&#xff0c;然后在存储过程中直接将其转换成我们需要的Tabl…

python处理报错_python3报错及解决方案/须注意的细节(持续更新)

问题&#xff1a;编码的问题导致。在pymysql.connect()创建连接时&#xff0c;参数charset"utf8",而非"utf-8".2、latin-1 codec cant encodecharacters编码的问题导致。数据库的编码和数据源的编码不一致&#xff0c;并且包含了不能处理的字符。出现这种报…