抽象类是一种特殊的类,它提供了统一的操作界面。建立抽象类是为了多态地使用抽象类的成员函数。抽象类是包含纯虚函数的类。
1. 纯虚函数
当在基类中不能为虚函数给出一个有意义的实现时,可以将其声明为纯虚函数。纯虚函数的实现可以留给派生类完成。纯虚函数的作用是为派生类提供一个一致的接口。一般来说,一个抽象类带有至少一个纯虚函数。
纯虚函数的定义形式:
virtual <函数类型><函数名>(参数表)=0
纯虚函数与普通函数定义的不同在于书写形式上加了“=0”,说明在基类中不用定义该函数的函数体,它并不表示函数返回值为0,只起形式上的作用。
#include<iostream>
using namespace std;
class Point
{
protected:
int x0, y0;
public:
Point(int i = 0, int j = 0)
{
x0 = i;
y0 = j;
}
virtual void set() = 0;
virtual void draw() = 0;
};
class Line :public Point
{
protected:
int x1, y1;
public:
Line(int i = 0, int j = 0, int m = 0, int n = 0) :Point(i, j)
{
x1 = m;
y1 = n;
}
void set()
{
cout << "Line::set() called " << endl;
}
void draw()
{
cout << "Line::draw() calles " << endl;
}
};
class Ellipse :public Point
{
public:
Ellipse(int i = 0, int j = 0, int p = 0, int q = 0) :Point(i, j)
{
x2 = p;
y2 = q;
}
void set() { cout << "Ellipse::set() called "; }
void draw() { cout << "Ellipse::draw() called "; }
protected:
int x2, y2;
};
void drawobj(Point *p)
{
p->draw();
}
void setobj(Point *p)
{
p->set();
}
int main()
{
Line *lineobj = new Line;
Ellipse *elliobj = new Ellipse;
drawobj(lineobj);
drawobj(elliobj);
cout << endl;
setobj(lineobj);
setobj(elliobj);
cout << "\n Redraw the obj...\n";
drawobj(lineobj);
drawobj(elliobj);
system("pause");
return 0;
}
类Line和Ellipse都有公有继承自类Point,该程序要实现多态,就必须定义set()和draw()函数为虚函数
2. 抽象类
包含纯虚函数的类称为抽象类。抽象类是一种特殊的类,是为了抽象和设计的目的建立的,处于继承层次结构的较上层。抽象类是不能创建对象的,在实际中强调一个类是抽象类,可以将该类的构造函数声明为保护的访问控制权限。
抽象类的主要作用是将有关的类组织在一个继承层次结构中,由抽象类为他们提供一个公共的根,相关的子类是从这个根派生出来的。抽象类刻画了一组子类的操作接口的通用语义,这些语义也传给子类。一般而言,抽象类只描述这组子类的共同的操作接口,而完整的实现留给子类。
使用抽象类要注意的问题:
(1)抽象类只能做其他类的基类,不能创建抽象类的对象,因为它的纯虚函数没有定义功能;
(2)抽象类不能用作参数类型、函数的返回值或者显式转换类型;
(3)可以声明抽象类的对象指针或对象引用,从而可以访问派生类对象成员,实现动态联编;
(4)若派生类中没有给出抽象类的所有纯虚函数的函数体,派生类仍然是一个抽象类;
文章评论(0条评论)
登录后参与讨论