EssentialC++第五章总结+课后习题+踩雷清单

总结

这章开始介绍了面向对象编程概念,最主要特质:继承和多态
继承我们知道了父类和子类,即基类和派生类,这两个类之间的关系叫继承体系
多态:动态绑定
然后介绍了继承体系,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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值