广告

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

2018-2-12 10:31 86 0 分类: 软件与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条评论)

登录后参与讨论
相关推荐阅读
LoneSurvivor 2018-02-19 11:36
C++多态(4)——特殊运算符重载和类类型转换
1.“++”和“--”的重载     运算符“++”和“--”的重载要区分前置和后置两种形式。如果不区分前置和后置,则使用operator++()或operator—()即可...
LoneSurvivor 2018-02-12 11:15
C++多态(3)——运算符重载
1.     运算符重载的定义     运算符重载也是实现多态的一个重要手段。运算符重载实现的是编译时的多态,即静态多态性。C++预...
LoneSurvivor 2018-02-11 16:24
C++多态(1)
1.     多态      多态是人类思维方式的一种直接模拟,多态性是指不同对象接收到相同的消息时,根据对象类的不同而产...
LoneSurvivor 2018-02-10 21:37
C++多继承的二义性问题
     在多重继承中,需要解决的主要问题是标识符不唯一,即二义性问题。比如,当在派生类继承的多个基类中有同名成员时,派生类中就会出现标识符不唯一的情况。 &nbs...
LoneSurvivor 2018-02-10 11:40
C++类的static成员
      对于某些特定类类型的全体对象而言,访问一个全局对象有时是有必要的。在程序运行的任意点可能需要统计已创建的特定类类型对象的数量,但是全局对象会破坏封装,并且没有...
我要评论
0
0
新年红包
Loading…
广告
关闭 热点推荐上一条 /1 下一条