<span style="font-size:24px;">//抽象类
//---------main.cpp------------
#include <iostream>
using namespace std;
class Display
{
private:
public:
virtual void init()=0; //在声明之后写上“=0”,就是纯虚函数
virtual void write(char *pStr)=0; //
};
class Monochrome : public Display
{
private:
public:
virtual void init(); //覆盖父类
virtual void write(char *pStr); //覆盖父类
};
class ColorAdapter :public Display
{
private:
public:
virtual void write(char *pStr); //覆盖父类
};
class SVGA : public ColorAdapter
{
private:
public:
virtual void init(); //覆盖
};
void Monochrome::init(){}
void Monochrome::write(char *pStr)
{
cout<<"Monochrome : "<<pStr;
}
void ColorAdapter::write(char *pStr)
{
cout<<"ColorAdapter : "<<pStr;
}
void SVGA::init(){}
void fn(Display *d)
{
d->init();
d->write("hello.\n");
}
int main(int argc,char **argv)
{
Monochrome mc;
SVGA svga;
fn(&mc);
fn(&svga);
return 0;
};</span>
Monochrome : hello.
ColorAdapter : hello.
请按任意键继续. . .
抽象类:定义抽象类就是在 类定义 中至少声明一个纯虚函数。纯虚函数就是在虚函数的声明形式后跟 “=0”。
这种语法格式是一种特别的约定,专门用于规定纯虚函数的,它也是抽象类的唯一标识。
抽象类是不允许有实力对象的,即不能有抽象类创建对象。
<span style="font-size:24px;">void func()
{
Display a;
a.init();
}</span>
抽象类不能创建对象,但可以使用抽象类的指针和引用来进行多态编程。
void fn(Display *d)
{
d->init();
d->write("hello.\n");
}
只要子类中尚有未被覆盖定义的纯虚函数,那么,子类相对于抽象父类状态不变,也就是子类也是抽象类。
Display类是抽象类,子类Monochrome 完全覆盖了父类中的所有纯虚函数,称为了具体类,而 子类ColorAdapter只覆盖了父类中的write纯虚函数,init纯虚函数没有被覆盖,所以子类ColorAdapter也就是抽象类了。子孙类SVGA由于继承了ColorAdapter,也就继承了write纯虚函数,加上自己的init纯虚函数,因此,子孙类SVGA也就覆盖了爷爷类中的所有纯虚函数,子孙类SVGA就成了具体类了。