总结
这章开始介绍了面向对象编程概念,最主要特质:继承和多态
继承我们知道了父类和子类,即基类和派生类,这两个类之间的关系叫继承体系
多态:动态绑定
然后介绍了继承体系,LibMat类,Book类和AudioBook类的三层类继承体系
介绍不带继承的多态(类之间的继承关系不大)
如何定义抽象基类,三要素(三步法)
如何定义派生类,很多要求
定义完了抽象基类和派生类,那么接下来就要对他们进行运用,
紧接着告诉你基类可以抽象,也可以具象化称为具象基类
然后说了一下具象基类的初始化析构复制这三个操作
派生类怎么定义虚函数包括虚函数的静态解析,很好体现了多态性
最后说明了RTTI(运行时鉴定机制),引入新名词
习题
5.1
实现一个两层栈类体系,基类纯抽象类,只提供最简单接口如下。两个派生类(LIFO_Stack和Peekback_Stack)自己具象化定义,Peekback_Stack类可以让用户在不更改stack元素的前提下,访问任何一个元素。
//为了遍历输出vector容器所有存储元素成栈的存储元素形式,我采用const_reverse_iterator,这种泛型指针可以以逆向方式,即由容器尾端
//(容器最末尾元素位置的下个位置)到前端(容器第一个元素的位置)遍历整个vector容器
#include<iostream>
#include<string>
#include<vector>
using namespace std;//它最大,typedef不能放在它前面!否则编译器报错
//error: 'string' does not name a type|
//error: 'elemType' has not been declared|
//(节选部分相同错误)
typedef string elemType;
//嵌套类型定义,给中间这个类型关键字(类型名)
//起个别的名字),这里只是为了灵活,这样栈里可以都存比如string型
//int型或者double型元素
class Stack{
public:
virtual ~Stack(){
}
virtual bool pop(elemType&) =0;
virtual bool push(const elemType&) =0;
virtual int size() const =0;
//基类成员函数和派生类同名成员虚函数声明/定义的函数原型不一致,会报错
//error: conflicting return type specified for 'virtual int LIFO_Stack::size() const'|
//error: overriding 'virtual bool Stack::size() const'|
virtual bool empty()const =0;
virtual bool full()const =0;
virtual bool peek(int index,elemType&) =0;
virtual void print(ostream& =cout) const =0;//成员函数声明时
//提供默认参数值
};//只提供接口的纯抽象类Stack
ostream& operator<<(ostream &os,const Stack &rhs)
{
rhs.print();
return os;
}
//重载运算符<<,意思就是打印<<左边的类对象的内容
class LIFO_Stack : public Stack{
//Stack的派生类LIFO_Stack(栈实体)
public:
LIFO_Stack(int capacity =0):_top(0)
{
_stack.reserve(capacity);
//reserve不要拼写成reverse,否则报错:
//error: 'class std::vector<std::__cxx11::basic_string<char> >' has no member named 'reverse'|
}
//LIFO_Stack派生类且采用成员列表初始化的类构造函数
//因为栈的先进后出的特性,所以_stack私有成员vector容器(正序存储元素)
//需要把容器内元素逆序,最后一个上第一个(栈顶),第一个上最后一个(栈底)
//倒数第二个上第二个,第二个上倒数第二个,就这样反转vector容器
//首先创建了栈类对象,这个栈肯定是空栈,所以栈顶指针指向0代表空栈
inline int size() const{
return _stack.size();}
//查询栈的大小
//当我们在派生类中,为了覆盖基类的某个虚函数而进行同名函数的声明时,
//可以不加关键字virtual
inline bool empty() const {
return !_top;}
//空了就输出true,所以!_top;
inline bool full() const {
return size()>=_stack.max_size();}
//max_size()泛型算法,功能是算容器的最大长度
//栈满返回true
inline int top()const{
return _top;}//返回栈顶指针
//这里const拼写有误,导致报错:
//error: expected ';' at end of member declaration|
bool pop(elemType &elem)
{
if(empty())
{
return false;//栈空,无法删除栈顶元素
}
elem=_stack[--_top];//先栈顶指针下移,然后弹出栈顶元素
//即当前栈顶指针指向的元素
_stack.pop_back();//弹出栈顶元素
return true;
}
bool peek(int