原创 C++多态(2)——纯虚函数与抽象类

2018-2-12 10:31 2098 20 20 分类: 软件与OS 文集: C++学习记录(1)

   抽象类是一种特殊的类,它提供了统一的操作界面。建立抽象类是为了多态地使用抽象类的成员函数。抽象类是包含纯虚函数的类。

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;

}

LineEllipse都有公有继承自类Point,该程序要实现多态,就必须定义set()draw()函数为虚函数

2.     抽象类

     包含纯虚函数的类称为抽象类。抽象类是一种特殊的类,是为了抽象和设计的目的建立的,处于继承层次结构的较上层。抽象类是不能创建对象的,在实际中强调一个类是抽象类,可以将该类的构造函数声明为保护的访问控制权限。

     抽象类的主要作用是将有关的类组织在一个继承层次结构中,由抽象类为他们提供一个公共的根,相关的子类是从这个根派生出来的。抽象类刻画了一组子类的操作接口的通用语义,这些语义也传给子类。一般而言,抽象类只描述这组子类的共同的操作接口,而完整的实现留给子类。

     使用抽象类要注意的问题:

(1)抽象类只能做其他类的基类,不能创建抽象类的对象,因为它的纯虚函数没有定义功能;

(2)抽象类不能用作参数类型、函数的返回值或者显式转换类型;

(3)可以声明抽象类的对象指针或对象引用,从而可以访问派生类对象成员,实现动态联编;

(4)若派生类中没有给出抽象类的所有纯虚函数的函数体,派生类仍然是一个抽象类;

文章评论0条评论)

登录后参与讨论
我要评论
0
20
关闭 站长推荐上一条 /2 下一条