酸菜猪蹄的程序人生
木下编程屯屯烫烫
   众所周知,在实现多态的过程中,一般将基类的析构函数设为virtual,以便在delete的时候能够多态的链式调用。那么析构函数是否可以设为纯虚呢?
class CBase
{
public:
    CBase()
    {
        printf("CBase()\n");
    }
    virtual ~CBase() = 0;
};
答案是可以,那么这样实现的目的是什么呢?当然是避免实例化。
但因为派生类不可能来实现基类的析构函数,所以基类析构函数虽然可以标为纯虚,但是仍必须实现析构函数,否则派生类无法继承,也无法编译通过。
posted on 2006-05-03 21:19 cooelaf 阅读(6590) 评论(10)  编辑 收藏 引用 所属分类: Pure C/C++
Comments
  • # re: C++中析构函数可以为纯虚吗?
    可冰
    Posted @ 2006-05-03 21:56
    纯虚的析构函数可以用来定义抽象类,这样就避免了实例化(正如作者所说的),而且另外一个好处是可以不用再在抽象类中定义另一个纯虚函数(这种情况很常见)来避免实例化。因为抽象类总是没有析构函数的,或者说抽象类的析构函数是无用的、多余的,现在正好变废为宝。

    但是这里的纯虚析构函数是可以不用实现的,否则还如何来避免实例化,也更不成其为纯虚函数了啊。

      回复  更多评论   
  • # re: C++中析构函数可以为纯虚吗?
    tianrolin
    Posted @ 2006-05-03 22:01
    请教一下楼主:
    什么叫做必须实现析构函数,否则派生类无法继承

    class Base
    {
    public:
    Base(){};
    virtual ~Base()=0{};
    };
    是你所说的实现么?  回复  更多评论   
  • # re: C++中析构函数可以为纯虚吗?
    cooelaf
    Posted @ 2006-05-03 23:36
    @tianrolin
    是的,就是这样,如果不实现~Base(), 如果有类从Base派生,就无法编译通过,因为有未实现的纯虚函数。是无法链接的。当然如果没有派生类,是不需要实现了,但是这样的一个类还有什么意义呢。  回复  更多评论   
  • # re: C++中析构函数可以为纯虚吗?
    cooelaf
    Posted @ 2006-05-03 23:37
    @可冰

    是要实现,但是只要标为纯虚,就不能实例话,和具体实现与否无关。纯虚与否只是编译器看的。  回复  更多评论   
  • # re: C++中析构函数可以为纯虚吗?
    音乐虫子
    Posted @ 2006-05-03 23:42
    更正搂主的一个说法,“链式调用”不是virtual才可以的,析构函数本来就是链式调用!正确的说法是virtual的析构函数和一般的virtual函数一样,使得调用的是真正对象的函数。
    例子代码演示就算析构函数不是virtual的情况下,派生类和基类的析构函是依然被链式调用了。但是,当指针是base的时候它不能从正确的析构函数开始:
    using namespace std;
    class Base
    {
    public:
    ~Base()
    {
    cout << "base\n";
    }
    };

    // derived class
    class Derived : public Base
    {
    public :
    ~Derived()
    {
    cout << "derived\n";
    }
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
    Derived* d = new Derived;
    delete d;
    Base* b = new Derived;
    delete b;
    return 0;
    }

    把基类修改成:
    class Base
    {
    public:
    virtual ~Base()
    {
    cout << "base\n";
    }
    };
    之后,就可以正确从派生类(真正的对象)开始调用析构函数
      回复  更多评论   
  • # re: C++中析构函数可以为纯虚吗?
    cooelaf
    Posted @ 2006-05-03 23:52
    @音乐虫子
    谢谢指正。我应该写“基类指针指向派生类对象的时候,通国delete基类指针来释放对象时保证链式调用。”  回复  更多评论   
  • # re: C++中析构函数可以为纯虚吗?
    音乐虫子
    Posted @ 2006-05-04 10:56
    哈哈~~~
    其实我想强调的是,构造函数的virtual和一般函数的virtual之间没有任何特别的地方。链式调用时构造函数固有的,和是否virtual没有关系。
    我知道搂主是明白的~~~,只怕有些看客可能有些迷糊:)
      回复  更多评论   
  • # re: C++中析构函数可以为纯虚吗?
    oosky
    Posted @ 2006-05-06 18:14
    楼主说的很明白了.
    支持楼主的说法.
      回复  更多评论   
  • # re: C++中析构函数可以为纯虚吗?
    林楚涛
    Posted @ 2008-11-10 17:04
    good good study! day day up!  回复  更多评论   
  • # re: C++中析构函数可以为纯虚吗?
    gancuimian
    Posted @ 2009-09-24 22:01
    纯虚析构函数还是要提供函数实体的,因为就算是抽象类,当它被继承后仍然会被实例化,而抽象类内部也有可能产生临时的数据,在析构时需要将其删除,此时抽象类的纯虚析构函数的函数体就会被调用  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理