9.4 纯虚函数和抽象类
纯虚函数是一种特殊的虚函数,在基类中声明纯虚函数,不给出其具体实现,在派生类中给出具体实现,基类中的纯虚函数只是一个入口。
virtual 函数类型 函数名(参数表)=0;
包含纯虚函数的基类称为抽象类
说明:
(1)可以定义抽象类的指针/引用,从而实现动态多态
(2)但抽象类不能建立对象、不能作为函数返回类型、不能作为函数参数的类型、不能用于强制类型转换,只能作为其他类的基类来使用(因为纯虚函数没有具体的实现)
例:
class point { /*……*/ } ;
class shape ; // 抽象类
{ point center ;
……
public :
point where ( ) { return center ; }
void move ( point p ) {center = p ; draw ( ) ; }
virtual void rotate ( int ) = 0 ; // 纯虚函数
virtual void draw ( ) = 0 ; // 纯虚函数
} ;
…...
shape x ; // error,抽象类不能建立对象
shape *p ; // ok,可以声明抽象类的指针
shape f ( ) ; // error, 抽象类不能作为函数返回类型
void g ( shape ) ; // error, 抽象类不能作为传值参数类型
int & h ( shape &) ; // ok,可以声明抽象类的引用
(3)区分:空函数 函数体为空
把函数名赋予0,本质上将指向函数体的指针赋为初值0
在没有重新定义这种纯虚函数之前,是不能调用这种函数的
(4)不允许从具体类(不含纯虚函数的)派生出抽象类
(5)抽象类可以包含普通成员函数/虚函数,虽然不能声明抽象类的对象,但可以通过派生类的对象来调用这些不是纯虚函数的函数
(6)抽象类的构造函数和析构函数不能调用纯虚函数
(7)!!
从抽象类派生出新类之后,如果派生类给出所有纯虚函数的实现,则这个派生类就不再是抽象类;否则,这个派生类仍然是抽象类,这样的派生类也是不能产生对象的
综上所述,抽象类的唯一用途是派生类提供基类,纯虚函数的作用是作为派生类的成员函数的基础,并实现动态多态。
class A{
protected: int x;
public: A(){x =1000;}
virtual void print()=0; //定义纯虚函数
};
class B:public A{ //派生类
private: int y;
public: B(){ y=2000;}
void print(){cout <<“y=”<<y<<‘\n’;}//重新定义纯虚函数
};
class C:public A{ //派生类
int z;
public: C(){z=3000;}
void print(){cout <<“z=”<<z<<‘\n’;}//重新定义纯虚函数
};
void main(void )
{ A *pa;
B b;
C c;
pa=&b;
pa->print();
pa=&c;
pa->print();
A a;
pa=&a;
pa->print( );//抽象类只能作为其他类的基类来使用,不能建立抽象类对象,其纯虚函数的实现由派生类给出。
}
//运行结果:y=2000
// z=3000
第11章 输入输出流
补充:C++重建自己的输入输出系统,目的:可以对用户自定义类型进行输入输出
11.1 流类和流对象
1、基本概念
C++将数据从一个对象到另一个对象的流动抽象为流(输入流、输出流)
实现设备之间交换信息的类称为流类
用流类定义的对象称为流对象 cin cout
按照面向对象方法组织的多个流类按层次结构构成的集合称为I/O流类库,简称流库
2、流的种类
第一种分类方法:
文本流:一串ASCII字符
二进制流:一串二进制数组成
12
文本流:31H 32H
二进制流:00001100
源程序文件和文本文件在传送时采用文本流
通常,文本流在不同设备之间进行传递时可能要做一些变换
二进制流在数据传送时不需做任何变换
第二种分类方法:
缓冲流:
系统在内存开辟的临时存放输入/输出流信息的内存区,称为缓冲区
对于缓冲流,只有当缓冲区满的时候或当前送入的数据为新一行数据时,系统才对流中的数据进行处理刷新
非缓冲流:
一旦数据送入流中,立即进行处理
3、C++流库的基本结构
C++流库中有两个平行的基类:
streambuf类作为输入输出操作在物理设备一方的接口,负责底层操作
ios类作为输入输出操作在用户一方的接口,负责高层的操作
4、头文件
iostream
iomanip
fstream
11.2 标准流和流操作
1、标准流对象简称为标准流
是C++预定义的对象 提供内存与外设之间的数据交换
2、通过流类中定义的公有成员函数进行流操作
3、cin istream类的对象,标准输入流
默认连接键盘,可以重定向
cout ostream类的对象,标准输出流
默认连接显示器,可以重定向
cerr ostream类的对象,标准错误输出流
连接显示器,不能重定向
clog ostream类的对象,标注错误输出流
连接打印机,不能重定向