tag 标签: 纯虚函数

相关博文
  • 热度 20
    2018-2-12 10:31
    2115 次阅读|
    0 个评论
    抽象类是一种特殊的类,它提供了统一的操作界面。建立抽象类是为了多态地使用抽象类的成员函数。抽象类是包含纯虚函数的类。 1. 纯虚函数 当在基类中不能为虚函数给出一个有意义的实现时,可以将其声明为纯虚函数。纯虚函数的实现可以留给派生类完成。纯虚函数的作用是为派生类提供一个一致的接口。一般来说,一个抽象类带有至少一个纯虚函数。 纯虚函数的定义形式: virtual 函数类型 函数名 ( 参数表 )=0 纯虚函数与普通函数定义的不同在于书写形式上加了“ =0 ”,说明在基类中不用定义该函数的函数体,它并不表示函数返回值为 0 ,只起形式上的作用。 #includeiostream 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)若派生类中没有给出抽象类的所有纯虚函数的函数体,派生类仍然是一个抽象类;