继承:
作用:减少重复代码,简化程序。
用法:
class b:public a
{
//...b中成员
}
在如上代码中,b类以public的方式继承了a类。规定a类是父类、基类,b类是子类、派生类。
关于继承方式:
包括public、portect、private
其中:public会保存父类成员原本的约束,如public修饰的成员仍是public,protect修饰得到仍是protec。 protect会把public约束的修改成protect约束,其余不变。 private会使得都是private约束。注:在父类中,受private约束的成员在子类中为不可见,无法使用也无法调用。
如果不加继承方式,class默认是private,struct默认是public。
赋值:
1.派生类的对象可以赋值给基类的对象、指针或引用,这叫切割、切片。
基类的对象不能赋值给派生类的对象。
基类的指针或引用可以通过强制类型转换的方式付给派生类的指针或引用,但是只有原本基类的指针指向派生类对象时才安全,不会出现越界访问。
作用域:
1.基类和派生类的作用域是独立的。
2.在基类和派生类中,如果出现重名的函数则会发生隐藏,即子类屏蔽父类的同名成员,这也叫重定义。此时要想访问父类中的该成员,则需要父类::父类成员来访问。
3.应注意对于同名函数,只要函数名相同就会被隐藏,无关参数列表和返回值。
默认成员函数:
1.如果父类无默认构造函数,则子类需要显示调用父类构造函数。
2.对于子类拷贝构造,需要显示调用父类拷贝构造。
3.子类赋值函数需要调用父类构造函数完成父类成员的赋值。
4.子类调用析构函数会自动调用父类析构函数。
5.对于子类,会先调用父类构造函数在调用子类构造函数,会先调用子类析构函数在调用父类析构函数。
6.由于子类和父类的析构函数会被编译器处理成同名函数destrutor(),因此父类和子类的析构函数会发生隐藏。
友元:
友元函数和友元类无法被继承。
静态成员:
静态成员相当于被子类和父类所共有,即仍是只有一份。
无法继承的类:
1.父类构造函数私有,此时子类无法显示调用父类构造函数,,因此无法构成继承。
2.加final修饰父类,此时规定该类无法被继承。
单继承:
子类只有一个直接父类。
多继承:
子类有两个及以上的直接父类。
菱形继承:
如图,此时b、c类继承a类,d类继承b类和c类,出现了菱形继承。
特点:d类中含有两份a类成员,一份从b类中继承来,一份从c类中继承来,会有二义性,即通过d类的对象访问a类的成员,无法确定是访问的b中继承来的还是c中继承来的。
解决方法:将b类和c类设置成虚继承,即b类和c类前加virtual。此时d类中只有一份a类的成员,b类继承来的那份a类变成一个指针,指针指向的空间存放当前距离d类中存放a类成员的地址的偏移量,c类中相同。
多态:
作用:同一个函数名,产生不同的效果。
产生条件:
1.继承关系
2.子类和父类中有虚函数,要求函数名、参数列表、返回值均一致。
3.父类的指针或引用调用该虚函数。
注:
1.父类中必须在虚函数前加virtual,子类可以不加virtual,此时仍可以构成多态。
2.子类和父类的返回值有些情况可以不同,比如返回值是父子类关系的指针和引用(可以是别的父子类)
3.析构函数只有是虚函数时才能正常使用,而不会发生隐藏。