抽象类

通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。

 

重载 隐藏 覆盖

重载

作用域相同

函数名相同,参数列表不同,返回值和调用约定不做考虑

 函数重载:C++ 允许多个函数拥有相同的名字,只要它们的参数列表不同就可以,这就是函数的重载(Function Overloading)。借助重载,一个函数名可以有多种用途。

参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。

函数的重载的规则:

  · 函数名称必须相同。

  · 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。

  · 函数的返回类型可以相同也可以不相同。

  · 仅仅返回类型不同不足以成为函数的重载。

重载原理:不同的编译器有不同的重命名方式

 

隐藏

子类函数隐藏父类函数

作用域不同(父类和子类)

函数名相同

参数列表,访问权限控制关键字,都不作考虑

 

覆盖

作用域不同(父类子类)

至少父类函数有virtual关键字

函数声明完全相同,特例为协变

覆盖的概念

父类有两个虚函数,子类重写一个,子类的虚表有几项有两项

如果子类新增虚函数,而父类没有,则这个虚函数会存放在子类的虚表中,位于已经重写的虚函数的后面

虚表中函数顺序的父类定义虚函数的顺序

当子类重写父类虚函数,子类重写后的虚函数会替换虚表中父类虚函数的位置,称之为函数覆盖

 

协变.调用规则

调用者的类型来决定查找的起点

1. 在调用者的类中,查找同名函数

如果没有,则往上一层查找,如果找不到,则报错

如果有,则不会往上面查找,可见的域就是当前找到的同名函数所在的域

2. 在当前可见的域中找到最佳函数(函数重载规则)

  1)如果唯一的最佳函数不是虚函数,那么该调用是直接调用

  2)如果唯一的最佳函数是虚函数,判断调用者是否是指针或者引用

    1.1 调用者是指针或者引用,则是间接调用(函数覆盖规则)

调用者不是指针或者引用,则是直接调用

 

继承和组合

继承

Class  人
{
};
Class 中国人:public 人
{
};

 

组合

Class 发动机
{
};
Class 车
{
发动机 宝马发动机
};