析构函数可以是纯虚函数
来源:互联网 发布:一个能看网络攻击网站 编辑:程序博客网 时间:2024/06/18 11:28
在某些类里声明纯虚析构函数很方便。纯虚函数将产生抽象类——不能实例化的类(即不能创建此类型的对象)。有些时候,你想使一个类成为抽象类,但刚好又没有任何纯虚函数。怎么办?因为抽象类是准备被用做基类的,基类必须要有一个虚析构函数,纯虚函数会产生抽象类,所以方法很简单:在想要成为抽象类的类里声明一个纯虚析构函数。
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
- 析构函数可以是纯虚函数
- 析构函数可以是纯虚函数
- 析构函数可以是纯虚函数
- 析构函数可以是纯虚函数
- 析构函数可以是纯虚函数
- 构造函数、析构函数可以抛出异常吗?为什么?
- C++ 构造函数和析构函数是否可以继承?
- 构造函数和析构函数是否可以被重载
- 析构函数为何可以为虚函数?
- C++ 构造函数和析构函数是否可以继承?
- C++ 构造函数和析构函数是否可以继承?
- (面试)析构函数可以为虚函数吗?
- 构造函数与析构函数是否可以抛出异常
- C++ 构造函数和析构函数是否可以继承?
- 析构函数可以重载吗??
- 构造函数不能为虚函数,析构函数可以为虚函数
- 构造函数不能为虚函数,析构函数可以为虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以声明为虚函数
- VS 设置在Release模式下调试的方法
- laravel5.3项目部署踩坑记录
- Mininet可视化应用
- 深入理解Android Telephony之RILD的启动
- 高级工程师要具备
- 析构函数可以是纯虚函数
- 四大组件之Activity
- C#SQL连接数据库
- 股票入门基础知识14:查看不同公司报表确定其股票涨跌率
- Scrapy学习笔记
- 学习笔记——同步、通信与死锁(1)
- 资料备忘
- 什么是web?
- 系统dos命令