/*
达内学习 C++ day52 2013-11-14
*/
回忆:
继承
1,继承的目的
a,代码复用 传承父类所有的数据(属性和函数)
b,扩展 一个子类具备父类所有的功能和特性
把一个子类对象 当做父类对象来看
2,组合 和 继承的关系
3,继承的语法
class B:继承方式 A{};
4,继承的方式
公开 保护 私有
5,如果是私有继承 如何对父类的数据进行访问
public 接口 或者 友元
6,不能被子类继承的
构造函数 析构函数 拷贝构造 赋值运算符
7,子类对父类构造函数 和 析构函数的调用
子类会默认调用父类的无参构造 和 析构函数
也可以指定调用父类的构造函数(初始化参数列表)
8,子类如何调用父类的拷贝构造函数和赋值运算符
子类会默认调用父类的拷贝构造函数 和 赋值运算符
一旦自定义了拷贝构造 和 赋值运算符 则必须显示的调用父类拷贝构造和赋值运算符。
9,名字隐藏
当子类继承了父类的数据,如果子类中定义了和父类重名的数据,则子类的数据会覆盖掉父类的。
如何使用父类的数据 父类名::
10,多重继承的语法
class C:public A,public B{};
11,多重继承引入的问题的解决
a,命名冲突的解决
使用父类名::
名字隐藏机制
b,子类重复继承父类的同名数据
可以采用虚继承-----解决菱形继承(多个类有共同父类和共同子类)
// -----------------------------------
多态
1,多态的概念 和 分析
一个父类对象的指针或者引用 执行或者引用子类对象时,调用父类型中定义的虚函数时,函数的表现会是相应的子类的实现。
继承是构成多态的基础,父类的指针和引用指向子类对象是前置条件,虚函数是构成多态的关键。
2,多态举例
3,虚函数在子类中覆盖父类的实现时,必须遵守函数重写的规则(overwrite)
函数名,参数列表,返回值都必须相同 访问权限没有限制
4,多态的应用
为了写出通用性代码
函数的参数 函数的返回值
5,多态的本质
虚函数表
对象的首地址 指向一个 存有虚拟函数地址的 虚拟函数表
6,运行时识别
a. typeid(类型)
typeid(对象)
typeinfo
name 取得类型名字
== 判断两个typeinfo 是否相等 判断类型是否一致
!= 判断两个typeinfo 是否不等
#include<typeinf>
b,dynamic_cast<类型>(对象)
static_cast<类型>(对象)
静态类型转换 转换之后无法判断是否转换成功,动态类型转换 可以判断是否类型转换成功,指针为空,代表转换失败。指针不为空 代表转换成功。
7,抽象类
具备纯虚函数的类叫抽象类
virtual void foo()=0;
抽象类不能实例化
抽象类除了不能实例化之外 和一个普通的类没有任何失败。
如果一个类中除了构造函数 析构函数 外所有的函数都是纯虚函数 这种类叫纯抽象类。
如果子类继承了抽象类,不去实现纯虚函数则子类成为抽象类。
8,如果一个父类指针指向一个子类对象 则 delete 父类对象指针 会调用父类对象的析构函数 ,子类析构的行为是不确定的
父类对象的指针 = new 子类型();
把父类的析构函数作成虚析构函数
当父类中有虚函数时,则把析构函数作成虚函数
//=============================================================
C++ 中的IO
命令行进行输入输出
cin(istream) cout(ostream)
#include<iostream>
文件的输入输出
ifstream 文件读
ofstream 文件写
iofstream 既能读也能写
#include<fstream>
字符串的操作
istringstream
ostringstream
#include<sstream>
格式化IO 和 非格式化 IO
格式化:考虑类型 非格式化:字节处理,不考虑类型
get()得到一个字符 put()输出一个字符