析构函数可以是纯虚函数

在某些类里声明纯虚析构函数很方便。纯虚函数将产生抽象类——不能实例化的类(即不能创建此类型的对象)。有些时候,你想使一个类成为抽象类,但刚好又没有任何纯虚函数。怎么办?因为抽象类是准备被用做基类的,基类必须要有一个虚析构函数,纯虚函数会产生抽象类,所以方法很简单:在想要成为抽象类的类里声明一个纯虚析构函数。

 class awov {

  public:

  virtual ~awov() = 0; // 声明一个纯虚析构函数

  };

这个类有一个纯虚函数,所以它是抽象的,而且它有一个虚析构函数,所以不会产生析构函数问题。但这里还有一件事:必须提供纯虚析构函数的定义:

  awov::~awov() {} // 纯虚析构函数的定义

这个定义是必需的,因为虚析构函数工作的方式是:最底层的派生类的析构函数最先被调用,然后各个基类的析构函数被调用。这就是说,即使是抽象类,编译器也要产生对~awov的调用,所以要保证为它提供函数体。如果不这么做,链接器就会检测出来,最后还是得回去把它添上。

虽然抽象类的析构函数可以是纯虚函数,但要实例化其派生类对象,仍必须提供抽象基类中析构函数的函数体。值得注意的是,我们是可以为纯虚函数提供定义的,不过函数体必须定义在类的外部。也就是说,我们不能在类的内部为一个=0的函数提供函数体。

所以,定义纯虚函数的真正目的是为了定义抽象类,而不是函数本身。

 

class a 

public: 
virtual ~a()=0; 
}; 

class b:public a 

public: 
virtual ~b(){}; 
}; 

int main() 

b bb; 

return 1; 
析构函数是纯虚函数的亦为抽象类。 
上面的例子所以错误,因为b继承a后没有改写a的纯虚函数,因此b也是抽象类,自然不能实例化。 
修改如下则正确: 
class a 

public: 
virtual ~a()=0; 
}; 

class b:public a 

public: 
virtual ~b(){}; 
}; 

a::~a(){};//改写a的纯虚函数,此时a仍为抽象类 

int main() 

b bb; 
return 1; 

注意此时a仍为抽象类不能实例化,a aa则错误。


原文:http://blog.chinaunix.net/uid-25544300-id-3236826.html

构造和析构函数是否可以为虚函数或纯虚函数:http://www.360doc.com/content/12/0814/11/219024_230101231.shtml

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值