一、OOP概述
面向对象的程序设计(object-oriented programming)的核心思想是数据抽象、继承和动态绑定;
继承:基类、派生类、虚函数
派生列表:首先是冒号,后面紧跟以逗号分隔的基类列表,每个基类前面可以有访问说明符;
派生类可以在重新定义的虚函数前面加 virtual,也可以不加;
派生类可以显示的注明使用哪个成员函数改写基类的虚函数,做法是在参数列表后加 override 关键字;
动态绑定:
当使用基类的指针或引用调用一个虚函数时,将发生动态绑定,由于在运行时发生绑定,所以又称为运行时绑定;
二、定义基类和派生类
1、定义基类
基类通常都应该定义虚析构,即使该函数不执行任何操作也是如此;
构造函数和静态函数不可以是虚函数;
virtual 只能出现在声明中,不能出现在定义中;
如果基类把函数声明成虚函数,则在派生类中隐式的也是虚函数;
派生类能访问公有成员,不能访问私有成员;
派生类能访问受保护成员,而其他用户则不能访问;
2、定义派生类
override 关键字放在 const 关键字和引用限定符后面;
能将基类的指针或引用绑定到派生类对象中的基类部分,编译器会隐式的执行派生类到基类的转换;
在派生类中含有与其基类对应的组成部分,是继承的关键所在;
派生类的构造函数:
派生类必须使用基类的构造函数初始化基类部分;也就是每个类控制它自己的成员初始化部分;
派生类构造函数通过初始化列表将实参传递给基类构造函数;形式是类名加圆括号内的实参列表;
首先初始化基类部分,然后按照声明顺序依次初始化派生类的成员;
class BB : AA
{
public:
BB(int a, int b) :AA(a), b(b) {}
private:
int b;
}
派生类可以访问基类的公有成员和受保护成员;
继承与static成员:
如果基类定义了一个静态成员,则在整个继承体系中只存在该成员的唯一定义;
如果基类的static成员是private的,则派生类无权访问;如果是public的,则既可以通过基类使用,也可以通过派生类使用;
派生类的声明:
声明中包含类名,但不包含派生列表;一个类不能派生自身;
class a : a //错误
{};
被用作基类的类
仅仅声明而没被定义的类不能用作基类;
一个类是基类的同时也可以是派生类;
最终派生类将包含直接基类子对象以及每个间接基类的子对象;
防止继承的发生:
防止一个类作为基类,可以在类名后面加关键字 final ,但可以继承别的类;
class a