c++基础速刷,查漏补缺(二)
速刷知识点,可用来查漏补缺
访问权限
pubic:公有
protected:保护
private:私有
在类内(定义类的代码内),三种都可以访问。
在类外(定义类的代码外),只能访问public成员。
无论何种继承,派生类都不能访问私有成员。
对于公有继承,“派生类对象”只能访问基类中的公有成员。对于私有和保护继承,“派生类对象”无法访问基类的所有成员。
1. 继承
功能:在现有类的基础上,定义一个新的类,使得可以在无需重新编写的情况下,进行功能拓展。
- 实现继承:使用基类的属性和方法,无需额外编码
- 接口继承:仅使用属性和方法的名称,具体实现由子类提供
- 可视继承:指子窗体类,使用了基窗体类的外观和实现。
功能:将数据和代码捆绑在一起,避免外界干扰和不确定性访问
3. 多态
功能:向不同对象,发送同一消息,不同对象会产生不同的行为
重载实现编译时多态,虚函数实现 运行时多态
总结:允许将子类类型的指针赋值给父类类型的指针。
多态的实现:
- override(重写,覆盖):子类重新定义父类的虚函数。
- override(重载):允许存在多个同名函数,通过不同的参数列表区分。
虚函数(virtual)
功能:当基类希望派生类自定义函数时,将该函数声明为虚函数。
- 虚函数是动态绑定的:使用虚函数的指针和引用可以找到实际类的对应函数
- 多态:前提条件(1)调用函数的对象必须是指针或者引用(2)被调用的函数必须是虚函数,且完成了重写
- 动态绑定绑定的是动态类型:虚函数对应的函数或属性依赖于对象的动态类型,发生在运行期。
- 构造函数不能是虚函数:在构造函数中调用虚函数,会执行父类的对应函数,因为自身还没有构造好,无法多态。
- 析构函数可以是虚函数,且在复杂类中,通常必须是虚函数。析构函数也可以是纯虚函数。
- 虚函数的工作方式:虚函数依赖虚函数表工作,表中保存虚函数地址,当用基类指针指向派生类时,虚表指针指向派生类的虚函数表
- 纯虚函数:有纯虚函数的类是抽象类,无法实例化。
- inline(编译时展开), static(静态), constructor(子类未构造) 三种函数不能为虚函数
- 派生类的虚函数重写定义必须与父类完全一致。
为什么需要虚继承
虚继承的本质是,让一个类共享他的基类。
- 解决多继承(从多个直接基类中产生派生类)的命名冲突和冗余数据问题。(实际中最好不要用多继承)
- 解决菱形继承,典型案例:iostream从istream和ostream直接继承而来,而istream和ostream各自继承自同一个类baseios。
空类
空类size为1,为了有地址,不同的空类地址不同
如果派生类继承的第一个是基类,且基类定义了虚函数表,则派生类共享该表首地址占用的存储单元。
抽象类与接口的实现
类中有任意一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数通过在申明中使用” = 0“来指定。
设计抽象类(也称ABC)的目的,是为了创造一个不能实例化的基类,作为接口使用。
遇到不会的知识点,欢迎在回复中提问,我会在回复中回答,或者另写文章具体讲解。
祝大家都能在秋招中斩获心仪的offer。
感谢阅读。