一、定义基类和派生类
0、基本概念:
class A{}
class B:public A {}
派生类需要通过派生类列表,明确指出它从哪个基类继承而来。
1、基类希望它的派生类各自定义适合自身的版本,在基类时将这些函数声明为virtual 虚函数。virtual 不能出现在类外部的定义
派生类需要对其内部所有重新定义的虚函数进行声明。(通过在后面加override 表明覆盖原来的哪个基类成员函数)
class Quate{
virtual double price(int n) const;
};
class Bulk_quote:public Quate{
double price(int n) const override;//后面加override
};
2、动态绑定
double print(const Quate& item){
double ret=item.price(n);
return ret;
};
print(Quate);//调用基类
print(Bulk_Quate);//调用派生类
在该成员函数中,形参是基类的引用(或指针)!!!,会动态绑定,根据实际输入类型决定调用的类型。
3、派生类对象中有两部分:除了自定义的成员还包含从基类继承来的对象
派生类到基类的隐式转换,
Quate item;
Bulk_Quate bulk;
Quate *p=&item;//p指向Quate对象
p= &bulk;//p指向bulk的Quate部分
但是没有基类到派生类的转换。
原因在于,无法判断该基类为独立基类还是属于派生类一部分存在的。
Quate base;
Bulk_quote* bulk=&base;//错误,不能将基类转化为派生类
派生类初始化构造函数先初始化基类部分,再初始化派生类部分;
析构函数,先析构派生类,再析构基类。
二、虚函数
见条款9
三、纯虚函数
从上面的定义可以看到,纯虚函数就是没有函数体,同时在定义的时候,其函数名后面要加上“= 0”。
纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,
它的实现留给该基类的派生类去做。这就是纯虚函数的作用。
引入原因:在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
四、访问控制与继承
五、继承中的类作用域
六、构造函数与拷贝控制