C++继承学习
一、学前思考回顾
使用继承是为了增加代码的可重用性。
多重继承不推荐使用,会增加代码的复杂性
虚继承的出现是为了解决多继承的数据冗余问题。
和java继承的对比?继承会不会降级?
二、知识总结
1.什么是继承?
你爸是公司总裁,百万富翁,你就不用白手起家从头开始,继承就好了。如果不是,也可以继承他的花呗
2.继承代表了IS-A的关系
男人女人是人类的一类、猫狗是动物的一类
3.访问控制和继承
3.1 自己类里面的就随便访问,继承的派生类访问基类则不能访问private,外部的类要想访问就只能访问public
3.2 派生类不会继承基类的
-
构造函数、析构函数和拷贝构造函数
-
基类的重载运算符
-
基类的友元函数
4.继承类型
4.1 通常只使用public继承。使用虚函数的前提之一也是必须是公有继承
4.2 基层应该遵循的规则(反思中的问题得以解决)
继承图片
5.多继承(你被嫌弃了兄弟,开发中不想用你, 我也懒得记你)
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};
6.菱形继承
羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据时,就会产生二义性。
这玩意儿不就是虚继承吗,多份数据取一份就好了,加上virtual限制。不加就会导致数据重复,浪费空间,二义性,很遗憾多继承会存在这样的问题,更遗憾的是我们根本不用多继承?但是恰巧我如果同时需要两个类中的数据怎么办?那就用!
三、问题解决
有这么几个问题,一起来瞧瞧
1.派生类好奇心太强想访问基类私有成员怎么办?show me code
基类写一个公有公有接口访问私有变量
class Father
{
public:
int youcanvisit();//提供访问接口
private:
int youCanVisit;
}
class Son: public Father
{
}
int main()
{
Son son;
son.youCanVisit();//进行访问
}
2.继承后构造函数析构函数的执行顺序如何
在下认为是先执行父类,再执行子类。析构函数是先执行子类,再执行父类。
查了下资料,在下说的没错。
3.同名成员加作用域访问即可(作用域::)
原来你只需要叫张三,存在同名就得叫贵州的张三和广东的张三
- 子类对象可以直接访问到子类中同名成员
- 子类对象加作用域可以访问到父类同名成员
- 当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数
4.C++的继承和JAVA的继承有什么区别?
- java就是C++的儿子,青出于蓝而胜于蓝。
- java的访问控制权限是包,同一个类全部可以访问,同一个包子类只能访问公有和保护,跨包就只能访问公有
- JAVA就加一个extends就继承了,手续没有C++复杂,默认公有继承,实际上就是优化了C++,写C++还不是都用公有继承。
- java中要重载父类的方法使用@override,C++就比较没礼貌,啥也不说就重载、覆盖或者隐藏。
5.C++中的内存对齐是什么东西?
强迫症使然。一个整型和字符型在一起本该是5个字节,但是为了对齐,提取字符长度是8个字节。
计算机对于基本类型存放的方式有限制,要求数据的收地值的值是某个数K(比如4或者8),这就是内存对齐。
6.为什么要进行内存对齐?
计算机对于内存的存取存在存取粒度,也就是每次4字节、8字节、16字节…以4字节为例子,每次存取都是4字节或者4字节的倍数。如果不进行内存对齐则每次取出来的内存块都要剔除不想要的的部分,合并提取出来的部分,效率低。
7.内存对齐规则
每个编译器都可以通过函数改变内存对齐规则,1、2、4、8、16。不过现在的CPU对于内存对齐与否的效率影响不是很大。但是对于小设备内存,还是节约些好
四、show me code