搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

#《Essential C++》读书笔记# 第五章 面向对象编程风格

[复制链接]
查看: 3|回复: 0

1万

主题

1万

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
45261
发表于 2020-2-14 19:14 | 显示全部楼层 |阅读模式
根柢常识

继续机订界说了父子(parent/child)关系。父类(parent)界说了全数子类(children)共通的共有接口(public interface)和私有实现(private implementation)。每个子类都可以增加或覆盖(override)继续而来的工具,以实现其本身怪异的活动。在C++中,父类被称为基类(base class),子类被称为(derive class)。父类和子类之间的关系则称为继续系统(inheritance hierarchy)。
多态:让基类的pointer或reference得以很是通明地(transparently)指向其任何一个派生类的工具。在步伐实行之前就已分解出应当挪用哪一个函数,这类方式被称为静态绑定(static binding);但在面向工具编程方式中,编译器没法得知具体哪一份函数会被挪用,这一分解操纵会耽误至运转时(run-time)才举行,这就是所谓的静态绑定(dynamic binding)。
界说笼统类第一个步伐就是找出全数子类共通的操纵活动,然后即是想法找出哪些操纵活动与典范相关(type-dependent),也就是说有哪些操纵活动必须按照差别的派生类而有差别的实现方式,这些操纵活动应当成为全部继续系统中的虚函数(virtual function)。
筹划笼统基类时,我们必要找出每一个操纵活动的拜候层级(access level)。假如某个操纵活动应当让一样平常步伐皆能拜候,我们应当将它声明为public;但假如某个操纵活动在基类之外不必要被用到,我们就将它声明为private,即使是该基类的派生类,亦没法拜候基类中的private member;一个拜候层级就是protected,这类层级活动可让派生类拜候,不答应一样平常步伐操纵。
每个虚函数,要末得有其界说,要末可设为“纯”虚函数(pure virtual function),假如对于该类而言,这个虚函数并无本色意义的话,将虚函数赋值为0,意义即是另它为一个纯虚函数。任何类假如声明有一个(或多个)纯虚函数,那末,由于其接口的不完整性(纯虚函数没有函数界说,是谓不完整),步伐没法为它发生任何工具,这类类只能作为派生类的子工具(subobject)操纵,而且条件是这些派生类必须为全数虚函数供给确切的界说。此外按照一样平常法则,凡基类界说有一个(或多个)虚函数,应当要将其destructor声明为virtual。
派生类由两部分组成:一是基类组成的子工具,由基类的non-static data member——倘使有的话——组成;二是派生类的部分(由派生类的non
-static data member组成)。类举行继续声明之前,其基类的界说必须已经存在。
data member假如是个reference,必须在constructor的member initialization list中加以初始化。一旦初始化,就再也没法指向另一个工具。假如data member是个pointer,就无此限制:我们可以在constructor内加以初始化,也可以先将它初始化为null,稍后再另它指向某个有用的内存地址。步伐筹划进程中我们即是按照这些差别的性质来决议要操纵reference或pointer。
当我们界说派生类时,我们必须决议,究竟要将基类中的虚函数覆盖掉,照旧原封不动地加以继续,假如我们继续了纯虚函数(pure virtual function),那末这个派生类也会被视为笼统类,也就没法为它界说任何工具。假如我们决议覆盖基类所供给的虚函数,那末派生类供给的新界说,其函数运转必须完全合适基类所声明的函数原型,包含:参数列表、返回典范、常量性(const-ness)。而且举行声明操纵时,不愿定得加上关键字virtual,编译器会根据两个函数的原型声明,决议某个函数能否会覆盖其基类中的同名函数。
练习题答案

练习5.1 实现一个两层的stack(仓库)类系统。其基类是个纯笼统类Stack,只供给最简单的接口:pop()、push()、size()、empty()、full()、peek()和print()。两个派生类则为LIFO_Stack和Peekback_Stack。Peekback_Stack()可以让用户在不变动stack元素的条件下,拜候任何一个元素。
[code]#include #include #include using namespace std;typedef string elemType;class Stack{public:    virtual ~Stack(){}    virtual bool pop(elemType&) = 0;    virtual bool push(const elemType&) = 0;    virtual bool peek(int index, elemType&) = 0;    virtual int top() const = 0;    virtual int size() const = 0;    virtual bool empty() const = 0;    virtual bool full() const = 0;    virtual void print(ostream& = cout) const = 0;};ostream& operator
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 全椒百姓网-全椒知名**,发布及时新鲜的全椒新闻资讯 生活信息 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表