继承
继承是面向对象软件技术当中的一个概念,与多态、封装共为面向对象的三个基本特征。继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。
被继承的类称为基类或者是父类;继承的类被称为子类或者是派生类。
继承方式
继承方式分为三类:公有继承、保护继承、私有继承。三类继承的不同之处,是改变继承成员数据的访问权限
- 公有继承:原来的成员数据访问权限不变
- 保护继承:原来成员数据访问权限private不变;public、protected都变为protected。
- 私有继承:原来成员数据访问权限都变为private
public | protected | private | |
---|---|---|---|
公有继承(public) | public | protected | 不可见 |
保护继承(protected) | protected | protected | 不可见 |
私有继承(private) | private | private | 不可见 |
继承兼容性
1.父类不能给子类赋值,子类可以给父类赋值。因为子类比父类空间大,能够填充满父类的空间。
- 因为子类继承实在父类的空间基础上进行扩展,因此子类的空间包含整个父类的空间,同时可以在此基础上增加新的变量,扩展空间。
2.父类指针可以指向子类对象,子类指针不能指向父类对象。因为子类指针指向的空间比父类大,有一些额外的值无法预料。
3.父类和子类可以出现同名的变量,但二者作用域不同
class Parent
{
int a;//parent::a
};
class Child : public Parent
{
int a;//child::a
};
4.静态变量整个家族都共用
- 父类如果有静态变量,则子类继承以后,子类的静态变量与父类一致,整个家族共用一个变量。
多继承
1.多继承会出现两个不明确的变量,解决方法:虚继承,使得最终继承只有一个确定的变量。
如图:
家具类具有成员数据m,而床类和沙发类同时继承家具类,因此二者都有数据成员m;而此时沙发床通过多继承,继承床类和沙发类,则m拷贝了两份,因此沙发床在调用m的时候具有二义性,无法确定到底是继承谁的m。
解决方法:床类和沙发类在继承家具类的时候采用虚继承的方法,采用虚继承以后,沙发床在继承二者时,发现二者继承了同一份变量便只会拷贝一次。
class Bed : virtual public Furniture
class Sofa : virtual public Furniture
class SofaBed : public Bed,public Sofa