继承
继承:一个类继承其父类(基类),根据继承类型的不同会拥有其父类不同的权限
继承的分类
公有继承:基类的变量成员不变
保护继承:基类的公有成员和保护成员对派生类来说都为保护成员,只能被它的派生类和友元访问,私有成员不变
私有继承:基类的所有成员对派生类都是私有成员,不可以被该派生类的子类访问
继承的种类和组合
单继承:一个基类一个派生类,一一对应
多继承:一个派生类有多个基类
组合:一个类内嵌其他类,或者说是包含其它类
多态
多态:多态允许派生类有其独特的特性。
虚函数和虚继承
1.虚函数:将成员函数前面标上virtual,派生类可以对该成员函数进行实现,这样可以让基类变量的指针访问派生类对象的成员函数
2.虚继承:多继承的情况下,如果类d的两个父类b、c有相同的基类a,对该派生类来说会在内存中存放两个基类a,这样增加了代码的体量。如果在b,c继承的关键词前面加上virtual,就成为虚继承,对于类d来说,只会存在一个基类a的实现;
虚函数表
编译器会为每一个拥有虚函数的类添加一个指针,指向并创建一个虚函数表,是一块连续的内存,存放每一个虚函数的调用JMP指令,该表中基类的虚函数放在前面,如果该虚函数在子类中有实现,就会将子类的实现放到基类处。由于在访问时总是前面的优先,所以指向基类的指针才能访问派生类的虚函数实现
注意
1.继承是is-a的关系,组合是has-a的关系
2.一般不推荐使用多重继承,推荐使用组合
3.避免子类中的成员和父类中的非virtual成员拥有同样的名称,从而产生遮掩,不利于调用
4.不要改变继承而来的缺省参数值。因为继承是动态绑定,缺省是静态绑定,会造成调用virtual函数时使用基类的默认参数值
5.私有继承对组合的优势是不用对空类赋予额外开销,在函数库等对内存要求高的开发中才可能用得到