C++ 编译器
C++编译器
- 当我们定义了一个类的时候, C++编译器在默认的情况下会为我们添加默认的构造方法, 拷贝构造方法, 析构函数和=运算符
- 在第一次创建对象的语句中如: MyString myString = "hello, world!";中, 如果我们定义的构造函数为如下, 则就是隐式调用构造方法, 如果构造方法使用了explicit修饰则会报错, 总之在第一次创建对象的语句中, 就算出现了=, 只能调用构造方法, 而不是=方法, 因为我们是要构造对象, =真正起作用是在这个对象创建完毕之后
MyString(const char *str="") { this->len = strlen(str); this->values = new char[this->len + 1]; strcpy(this->values, str); }
C++中的对象在内存中的分布
没有继承的情况下
- 就是一个结构体的分布
单继承的情况下(方法使用virtual修饰)
- A为基类, B为派生类, 在创建B的实例的时候, 在内存中B的内存中会有一个虚指针(virt_pa)指向一个虚函数表, 注意是一个虚指针(virt_pa), 默认先拷贝A中的虚函数表, 如果B中有新的虚函数则注册到这个表中, 若B中重载了A中的虚函数, 则将虚函数表中的那个对应的虚函数改成B的虚函数(这就是实现多态的关键)
在多继承的情况下(方法都是用virtual修饰)
- A和B为C的基类
- 和单继承类似, 只不过多出了一个虚指针(virt_pb), 这个虚指针对应的虚函数表在C对象创建的时候会自动拷贝B的虚函数表, 而另外一个虚指针(virt_pa)指向的虚函数表则拷贝A的虚函数表, 接着在看C类中定义的函数, 如果C中出现了新的虚函数, 则将这个虚函数放到C第一个继承的基类在C对象中对应的虚指针指向的虚函数表中, 这里指的就是A, 也就是所B中多出来的foo函数的地址会放到virt_pa指向的虚函数表中, 如果C重载了函数, 则判断是重载了哪个函数, 这个函数从哪个基类中继承过来的, 知道了是从哪个基类中继承过来的, 就可以通过对应的虚指针找到被重载的函数在虚函数表中的位置, 将其替换成C中重载了的函数, 比如, A中有一个foo函数, C中也有一个foo函数, 则编译器会通过virt_pa指针在对应的表中将C::foo的地址替换到A::foo所在的位置
多重单继承
- A -> B -> C
- 和单继承非常的类似, 也是只有一个指针, 这个指针为virt_pa, 可以知道是超级基类的, 在创建C对象的时候, 将A和B中的虚函数表拷贝到C中的virt_pa对应的虚函数表中, 在考虑重载
虚继承
- A -> B
- 虚继承与上面的继承最大的不同就是在创建了B对象的时候, 会有两个虚指针, 一个是virt_pa, 另外一个是virt_pb, 多出来一个与B相关的指针; 除此之外, virt_pb指向的虚函数表只保存B类中定义的所有的虚函数, 如果B重载了A中的某一个方法, 则就会将B中那个函数的指针拷贝到virp_pa指向的虚函数表中的被重载函数的位置
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
最小化DevOps自动化流程(Golang)
Why? 为什么要做自动化流程? 在开发过程中,我们在本地机器上做开发,完成一次功能迭代之后,如何发布到远程产品服务器一直是个很头疼的问题。最通常的做法就是使用(S)FTP把代码(或者代码压缩包)覆盖到服务器上。这样的做法虽然“直截了当”,但是容易出错,而且全程需要人为干预。(笔者亲历过其他项目部门的负责人过来求助,说发布时拷贝代码到服务器的过程中,服务器突然宕机没有反应。)所以我们需要一种方式帮助我们完成代码发布的整个过程。有非常多的第三方工具帮助我们实现流程自动化的目的。 我们要完成的目标是:1,无人干预;2,缩短发布时间,减少发布时期存在的风险;3,增加项目迭代效率。 What? 用什么工具来做自动化流程? git, github(gitlab) When? 在什么时机下创建自动化流程? 理论上是在第一次发布项目到服务器之前就需要做自动化流程。但是根据迭代开发的思想,我们在创建项目的时候就应该开始着手创建自动化流程。 How? 如何创建一个最小化的自动化流程? 我们通过三部实现开发部署流程自动化。 创建版本仓库 笔者使用Gitlab创建一个名为DevOps的私有仓库. new g...
- 下一篇
Redis命令——事务
Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。 一个事务从开始到执行会经历以下三个阶段: 开始事务。 命令入队。 执行事务。 实例 以下是一个事务的例子, 它先以MULTI开始一个事务, 然后将多个命令入队到事务中, 最后由EXEC命令触发事务, 一并执行事务中的所有命令: redis 127.0.0.1:6379> MULTI OK redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days" QUEUED redis 127.0.0.1:6379> GET book-name QUEUED redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series" QUEUED redis 127.0.0.1:637...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Red5直播服务器,属于Java语言的直播服务器
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS关闭SELinux安全模块