当前位置:编程学习 > C/C++ >>

C++虚函数和纯虚函数(2)

 

本来只想看看书就过了,但是最近在看《设计模式》和《effective C++》这两本书,其中将到很多关于C++中封装,继承和多态的思想,所以不得不做一些笔记。

 

关于虚函数,在多态当中,一定要将基类的析构函数设置为虚函数并将其实现,只有这样,才能够达到按对象构造的逆序来析构对象;否则,析构的时候,只会析构基类的那一部分,那么派生类那一部分就无法成功析构了。

class shape

{

public:

    shape(){};

    virtual void draw() = 0;

    virtual ~shape(){cout << "shape destruction" << endl;}

};

 

class rectangle : public shape

{

public:

    rectangle(){};

    void draw()

    {

 

    }

    ~rectangle(){cout << "rectangle destruction" << endl;}

};

 

class round : public shape

{

public:

    round(){};

    void draw()

    {

 

    }

    ~round(){cout << "round destruction" << endl;}

};

 

void main()

{

    shape * s;

 

?    s = new rectangle();

    s->draw();

    delete s;

 

    s = new round();

    s->draw();

    delete s;

}

 

 

--------------------------------------------------------------------------------

 

 §纯虚函数

 

在虚函数的中举了shape的例子,里面有个draw函数,但是如果具体去实现的话,draw shape?这实现起来很模糊,如果将shape基类实例化的话,就搞不清draw什么了(画出乱七八糟的东西,这不是客户需要的东西,客户需要的是具体的图形)。因此有必要在基类shape当中,将draw的定义(实现)除去,而将它的定义(实现)留给派生类。

 

?class shape

{

public:

    shape(){};

    virtual void draw()=0;    //纯虚函数

};

  

class rectangle : public shape

{

public:

    rectangle(){};

    void draw()

    {

        画方形;

    }

};

  

class round : public shape

{

public:

    round(){};

    void draw()

    {

        画圆形;

    }

};

  

void main()

{

    shape * s;

  

    s = new rectangle();

    s->draw();

  

    s = new round();

    s->draw();

}   

 

作者 捣乱小子

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,