具有相同特性的对象,抽象成类。
封装:把定义的数据和操作数据的函数进行整合,然后隐藏属性和实现细节,对外提供接口,控制
继承: 共有继承:子类可以访问父类的 pubilic和protected成员,保持原有的状态
私有继承:子类可以访问父类的 pubilic和protected成员,并且将pubilic和protected成员作为自己的private成员,该子类可以访问,但是该子类的子类无法访问(因为其父类相关成员变成了私有成员)
保护继承:子类可以访问父类的 pubilic和protected成员,并且将pubilic和protected成员作为自己的protected成员,只能被它的派生类成员函数或友元访问
多态: 重载: 同一个作用域(同一个类)函数名相同,但是参数类型或者个数不同,返回值不同
重写: 不同作用域内(父类和子类),函数名相同,参数个数类型和返回值相同
重定义:不同作用域内,不构成重写,都称之为重定义 (我的理解就是不同作用域的重载)
继承中的构造和析构函数,先有基类的构造再有子类的构造,然后析构函数与构造函数的顺序相反
构造函数:1.在没有定义构造函数时,系统会自动生成一个空的构造函数。
2.构造函数与类名相同
3.可以被重载
析构函数:1.在类名前加~
2.有且只有一个
3.对象注销时自动调用析构函数,先构造的对象后析构
父类和子类同名的成员变量
访问: 子类直接访问
访问父类需要加父类的作用域:: 例如(son.func())
父类和子类同名的成员函数
访问: 子类直接访问
访问父类需要加父类的作用域:: 例如(son.father::func())
当子类与父类拥有同名的成员函数,子类会隐藏父类中同名的成员函数,加作用于可以访问到父类中同名函数
多重继承需要加作用域,菱形继承导致数据有两份,导致数据浪费,利用虚继承可以解决菱形继承 virtual
纯虚函数 关键字virtual
纯虚函数和虚函数的区别在于 有没有“=0”,一个实现了函数,一个未实现
类中有一个纯虚函数就是抽象类
特点:
1.不允许使用实例化对象(创建对象)
2.抽象类的子类必须要重写父类中的纯虚函数,否则也是抽象类
父类的指针指向子类对象
虚析构和纯虚析构
虚:virtual ~类名() 作用:父类的指针在析构的时候不会调用子类中析构函数,出现内存泄漏情况,所以在父类中加入虚析构可以解决
纯虚:virtual ~类名() =0
类名:~类名(){} 需要有声明也需要有具体实现
模板:template
声明一个模板,告诉编译器后面代码中紧跟着T不要报错,T是一个通用数据类型
普通函数和函数模板区别:
1.普通函数会发生隐式类型转换
2.函数模板不会发生隐式类型转换
3.函数模板显示指定类型发生隐式类型转换,例如指定为int 函数名();