- 继承: 联系一起的类有层次关系。
- 基类: 层次关系的根部
- 派生类:
基类负责定义在层次关系中所以类共同拥有的成员,派生类定义其各种特有的成员。
基类类型相关的函数, 派生类不做改变直接继承的函数
某些函数基类希望派生类个字定义适合自身的版本,此时基类就将这些函数声明成虚函数。
class Quote { public: string isbn() const; virtual double net_price(size_t n) const; };
派生类必须通过使用类派生列表,指明从哪个基类中继承而来。
class Bulk_quote: public Quote{ public: double net_price(size_t) const override; };
派生类必须重新定义虚函数进行声明。
double print_total(ostream & os, const Quote & item, size_t n) { double ret=item.net_price(n); os<< item.isbn()<<n<<"total_due"<<ret<<endl; return ret; }
可以使用 print_total(cout, basic, 20);// Quote 类型
print_total(cout, bulk, 20);// Bulk_quote 类型
item 形参是基类的引用。因此函数运行版本由实参决定,在运行时选择函数的版本, 所以动态绑定, 运行时绑定()
基类中通常定义虚析构函数。
virtual 函数,派生类必须要重新定义。 覆盖基类继承来的旧定义。
基类希望派生类有权访问, 同时禁止其他访问, protected.
定义派生类: 使用派生列表, 基类前可有三种访问说明符: public, private, protected
作用是控制派生类从基类继承的成员是否对派生类用户可见。
public: 基类的公有成员也是派生类接口的组成部分。
派生类对象:
派生类自己定义的(非静态)成员子对象;
一个与该派生类继承的基类对应的子对象;
bulk_quota 有四个数据元素: 从quote 继承的bookNo, 和price 数据成员,以及bulk_quote 自己的min_qty 和discount
Quote item;
Bulk_quote bulk;
Quote * p= & item;// p 指向quote 对象
p= & bulk;// p 指向bulk 的quote 部分
Quote & r=bulk;// r 绑定到bulk 的quote 部分;把派生类对象的引用指针用在需要基类引用指针的地方。
派生类必须要使用基类的构造函数初始化它的基类部分。
Bulk_quote(const string & book, double p, size_t qty, double disc):
Quote(book, p),
min_qty(qty), discount(disc){}
};
派生类可以访问基类的公有成员和受保护成员。。
如果基类定义类静态函数, 则在整个继承体系同只存在该成员唯一的定义。
虚函数的调用可能在运行时才被解析。