纯虚函数与抽象类(C++学习笔记)

在许多情况下,在基类中不能为虚函数给出一个有意义的定义,这时可以将它说明为纯虚函数.它的定义留给派生类来做.说明纯虚函数的一般形式为:

class  类名{

       virtual 类型 函数名( 参数列表 )=0;

}

下面是一个纯虚函数的简单例子:

/**
 * @author hqlong
 * @link   http://hqlong.com
 * @date   2007-05-31
 */
#include <iostream>
using namespace std;
class A{
public:
        virtual void echo() = 0;//纯虚函数,作为类A的抽象类
};
class B:public A{
public:
        virtual void echo(){
               cout << "Class B" << endl;
        }
};
class C: public B{
public:
        virtual void echo(){
               cout << "Class C" << endl;
        }
};
 
void show(A *a){
        a->echo();
}
int main(){
        B *b = new B;// B::echo();
        C *c = new C;// C::echo()
        show(b);
        show(c);
        return 0;
}

在该例子中,A类的虚函数echo()仅起到为派生类提供一个一致的接口作用,派生类中重定义的echo()用来决定显示内容,由于在A类中不能对些作决定,因些被说明为纯虚函数.

1.         一个类可以说明多个纯虚函数,包含有纯虚函数的类称为抽象类.一个抽象类只能作为基类来派生新类.不能说明抽象类的对象.

A a; //error

但可以说明指向抽象类的指针(或引用).

A *p; // OK

2.         从一个抽象类派生的类必须提供纯虚函数的实现代码,或者在该派生类中仍将它说明为纯虚函数.否则编译器将提示错误信息.

3.         说明了纯虚函数的派生类仍是抽象类.如果派生类中给出了基类所有的纯虚函数的实现,则该派生类不再是抽象类.

4.         抽象类至少含有一个虚函数,而且至少有一个虚函数是纯虚函数.

5.         一定要纯虚函数与空的虚函函数区分开来.

virtual void echo() = 0; //纯虚函数
virtual void echo(){}; //空的虚函数

 

6.         在成员函数内可以调用纯虚函数,但在构造函数或者析构函数内调用一个纯虚函数将导致程序运行错误,因为没有纯虚函数定义代码.

class A{
public:
    virtual void f() = 0;
        void g() { f(); }      //OK
        A(){f();}              //Error
}

为了进一步说明它们的使用方法,再给一个例子.

编写一个程序,用于计算正方形、三角形和圆的面积.

/**
 * @author hqlong
 * @link   http://hqlong.com
 * @date   2007-05-31
 */
 
#include <iostream>
using namespace std;
//定义抽象类Shape
class Shape{
public:
        virtual float area() = 0;
};
//求面积
float total(Shape *s[],int n){
        float sum;
        for(int i = 0; i<n; i++) sum += s[i]->area();
        return sum;
}
//正方形类
class Triangle:public Shape{
protected:
        float mH,mW;
public:
        Triangle(float h, float w){
               mH = h;
               mW = w;
        }
        float area(){
               return mH * mW * 0.5;
        }
};
//长方形类
class Rectangle:public Triangle{
public:
        Rectangle(float h, float w):Triangle(h,w){}
        float area() { return mH * mW; }
};
//圆类
class Circle:public Shape{
protected:
        float mRadius;
public:
        Circle(float r){mRadius = r;}
        float area(){
               return mRadius * mRadius * 3.14;
        }
};
 
int main(){
        Shape *s[4];
        s[0] = new Triangle(3.0,4.0);
        s[1] = new Rectangle(2.0,4.0);
        s[2] = new Circle(5.0);
        s[3] = new Circle(8.0);
        float sum = total(s,4);
        cout << sum << endl;
        return 0;
}

程序运行如下:

-1.07374e+008

该例子,Shape类的虚函数area仅起到为派生类提供一个一致的接口的作用,派生类中重定义的area()用于决定以什么样式计算面积.由于Shape类中不能对此作出决定,因此被说明为纯虚函数.

赋值兼容规则使我们将正方形、长方形、圆都视为形状,多态性又保证了函数total在对各种形状求面积之和时,无须关心当前正在计算哪种具体形状的面积.在需要时,函数total可从这些形状的对象那里获得该对象的面积,成员函数area保证了这点.

 

2007-05-31 机器人 于 北京

此条目发表在 c/c++ 分类目录,贴了 , , , 标签。将固定链接加入收藏夹。

纯虚函数与抽象类(C++学习笔记)》有 8 条评论

  1. avastyTit 说:

    north face womens jackets
    the north face softshell
    north face mens

  2. viagra 说:

    interesting article but I’m not sure if the author is correct here.want ot learn about our website you should visit our website we are the top leader in the interest industry of online information and planning of ph@rma stuff, go to us

  3. 钱安舍妓 说:

    杭州最好的夜场是杭州东方魅力www.dongfangmeili.cn

    杭州最好的ktv是哪儿?是杭州东方魅力www.dongfangmeili.cn

    杭州夜场招聘首选杭州东方魅力www.dongfangmeili.com.cn

    杭州最好的夜总会是杭州东方魅力www.dongfangmeili.com.cn

    杭州东方魅力官方网站欢迎你 联系电话:13666653761 官方微信:dongfangmeili

  4. Pingback 引用通告: best halloween creative ideas and horror artwork

  5. Pingback 引用通告: best free designs

  6. Pingback 引用通告: This is why this video will make you like Indie Euro Rock again!

  7. Pingback 引用通告: best wordpress for visual building

  8. Pingback 引用通告: photoshop tips for beginners

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>