1:当派生类是多继承时,若两个以上的基类有同名成员,而派生类中无同名成员,通过派生类对象引用基类基类同名成员时,将造成二义性。二义性的检测在访问权限检测之前(此处访问权限是指各个类中的权限);若想使用基类的同名成员函数(或数据成员),有两种方式:
1>派生类对象调用时可以在成员函数之前加上类的作用域 类名:: ,即类名::成员函数。
2>赋值兼容原则:即定义基类指针指向派生类对象的地址,则该指针永远只能调用基类的成员函数和数据成员。
注意:单一继承不存在调用二义性。
基类指针可以指向基类对象,也可以指向派生类对象;但派生类指针只能指向派生类对象。
多继承是指从派生类往父类看的,
2:构造函数
类的构造函数无返回值类型,可以重载;当定义对象时,先分配单元,再调用构造函数;
定义类的引用时,将会调用类的拷贝构造函数,注意:定义类的引用对象时一定要初始化。
调用构造函数顺序:先调基类构造--->子对象构造--->派生类构造
只有定义对象的时候才会调用构造或者拷贝构造函数。
拷贝构造函数:与类名同名,只有一个形参,且只能是类的对象的引用。eg: 类名(类名 & 对象名)
3:析构函数
不能重载,无返回值类型,无形参,用于释放对象单元;C++中用new分配的单元(用delete释放,再让指针指向NULL,避免成为野指针)
析构函数的调用顺序与构造函数的调用顺序完全严格相反。
4:就近原则
就近原则:若基类和派生类出现同名成员时,则基类对象只能调用积累的同名成员,派生类对象优先调用派生类的同名成员函数。
就近原则只用于派生类
5:访问类的私有
只能通过类自己的成员函数或者自己的友元函数来访问。
6:继承路径的二义性
继承路径的二义性与前面的调用二义性是不同的。
继承路径二义性:1>当一个基类派A 生两个或以上的派生类(如B、C)时,系统会为每个派生类生成一个基类副本
2>如果派生类中没有定义基类的同名成员函数
3>两个派生类派生一个最派生D
结果:通过最派生类D对象调用访问基类A的成员时,系统无法确定沿着哪条继承路线访问基类A,因为此时路线有两条(即ABD、ACD)
解决方法:将基类A声明为虚基类,此时派生多个派生类,系统将不会为每个派生类产生基类副本。
虚基类的构造只能调用一次,即其中一个派生类调用虚基类的构造之后,其他派生类将不再调用虚基类的构造。
派生类调用构造顺序:先调基类构造(此处先调虚基类构造,再调非虚基类构造)--->再调子对象构造--->派生类自己的构造
7:多态
多态:一个函数名称实现不同的结果(即对一个同名函数的调用,系统将产生不同的结果)
函数重载属于静态多态。