先回答标题中中的几个问题:

  • 析构函数可以为纯虚函数吗?
    yes。
  • 纯虚函数可以有函数体吗?
    yes。
  • 纯虚函数需要函数体吗?
    一般来讲,如果析构函数是纯虚函数,那么析构函数必须要有函数体,如果是其它函数为纯函数,没有必要写函数体。

那么现在问题又来了:

  • 析构函数什么时候应该声明为纯虚函数?
  • 当析构函数为纯虚函数时,为什么需要定义函数体?

1、纯虚函数与抽象类

基本概念相信大家都有所了解,这里主要强调几点:
(1)抽象类不能用例实例化对象,即不能用抽象类来定义一个对象。
(2)如果一个类包含一个纯虚函数,那么就是抽象类。即抽象了至少包含一个纯虚函数。
(3)抽象类中并不是所有的函数都是纯虚函数

2、虚函数和纯虚函数的区别

我们经常在看到类似如下的定义,于是很多人就存在一个误区,以为虚函数和纯虚函数就是有没有函数体的区别

class Base {public:virtual void func1() {  // 虚函数cout << "Base: func1" << endl;}virtual void func2()  = 0; // 纯虚函数};

其实纯虚函数也是可以有自己的函数体的:

class Base {public:virtual void func1() = 0;virtual ~Base() = 0; // 纯虚函数};
void Base :: func1() {  // 纯虚函数func1 函数体}
Base :: ~Base() {   // 纯虚析构函数 函数体}

通过上面的例子只是想说明,纯虚函数也是可以有函数体的,只是大多数时候没有必要

3、什么时候析构函数声明为虚函数?

先说一下,析构函数为虚函数和非析构函数为虚函数有啥不同?
当析构函数为虚函数时,在子类析构的时候,也会连同父类一起析构。

#include <bits/stdc++.h>
using namespace std;
class Derived : public Base {public:void func1() {cout << "Derived: func1" << endl;}~Derived() {cout << "~Derived" << endl;}
};
int main()
{Base * pd = new Derived;pd->func1();cout << "finish...\n";delete pd;return 0;
}

打印结果如下:

从上面的结果可以看到,如果是普通的虚函数func1,只会调用调用派生类的func1, 但是如果是虚析构函数,还会调用基类的析构函数。即:当基类的析构函数设置为虚函数时,delete时可以实现多态链式调用,子类的析构函数会调用父类的析构函数,并一层一层向最顶层的基类传递。

因此,如果我们在析构子类的时候,也希望基类也进行相关的析构动作,那么就需要将析构函数设置为虚函数

4、纯虚析构函数

如果我们想创建一个抽象类,我们知道,抽象类中必须包含至少一个纯虚函数,如果基类没有其它合适的函数适合作为纯虚函数,那么我们就可以将析构函数声明为纯虚函数。也就是说,这里将析构函数定义为纯虚函数,只是为了建立一个抽象类的需要

由于析构函数为虚函数(纯虚函数或非纯虚函数), 子类在析构的时候都会调用基类的析构函数,基类的析构函数必须要有函数体。这就是为什么当析构函数声明为纯虚函数时,也必须要有函数体, 不然没法被子类调用,这也是为什么非析构函数作为纯虚函数时,一般不需要函数体,因为子类不会调用基类的函数。

析构函数可以为纯虚函数吗?纯虚函数可以有函数体吗?纯虚函数需要函数体吗?相关推荐

  1. C++中虚函数的理解,以及简单继承情况下的虚函数的表!

    面向对象的三大特征=封装性+继承性+多态性 封装=将客观事物抽象成类,每个类对自身的数据和方法实行权限的控制 继承=实现继承+可视继承+接口继承 多态=将父类对象设置成为和一个或者更多它的子对象相等的 ...

  2. 虚函数表 对C++ 了解的人都应该知道虚函数

    虚函数表 对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的.简称为V-Table.在这个表中,主是要一个类的虚函数的地址表 ...

  3. 木老师教笨笨课堂——系列讲座(从函数指针到委托) 三、C++语言里的函数指针...

    先来回顾一下,我们说函数指针有一个重要的特性,它可以指向任何形参相同的函数.这样可以用统一的方式去调用不同的函数.(这个我还是希望笨笨同学好好思考一下,我想也是程序思想的精髓之一吧),就好比武功秘籍中 ...

  4. c2064 项不会计算为接受0个参数的函数_【JS必知必会】高阶函数详解与实战

    本文涵盖 前言 高级函数概念 函数作为参数的高阶函数 map filter reduce sort详解与实战 函数作为返回值的高阶函数 isType函数与add求和函数 如何自己创建高阶函数 前言 一 ...

  5. linux 虚函数调用性能,C++对象布局及多态实现探索之虚函数调用

    我们再看看虚成员函数的调用.类C041中含有虚成员函数,它的定义如下: struct C041 { C041() : c_(0x01) {} virtual void foo() { c_ = 0x0 ...

  6. C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)

    C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...

  7. linux signal函数用法,linux信号机制之sigaction构造体浅析,signal 函数,信号捕捉.

    来自:http://hi.baidu.com/phenix_yw/blog/item/6eb4ca391d1479f23a87ce19.html 信号安装函数sigaction(int signum, ...

  8. python函数定义和其四种参数_python入门第九课:函数的定义及多种参数传递方式...

    本教程使用的课本是<Python编程:从入门到实践>,作者:[美] Eric Matthes 本节介绍Python中的函数,函数是可以反复使用的一段代码,有了函数能大大简化编程工作量,还能 ...

  9. c语言 lookup函数怎么用_菜鸟记502用lookup和vlookup函数核对数据的一个小栗子

    欢迎转发扩散点在看 万一您身边的朋友用得着呢? 各位朋友早上好,小菜继续和您分享经验之谈,截止今日小菜已分享400+篇经验之谈,可以文章编号或关键词进行搜索. 微信推送规则发生改变,如果您想看到小菜每 ...

  10. day4 匿名函数、装饰器、生成器、迭代器、内置函数、 json 与 pickle 模块

    文章目录 1.列表生成式 2.匿名函数 3.装饰器 4.生成器 5.迭代器 6.内置函数 7.json & pickle 序列化与反序列化 1.列表生成式 可通过特定语句便捷生成列表 list ...

最新文章

  1. c 应用程序多语言版本,c – 在win32 API应用程序中实现全球化/多语言功能
  2. 程序猿误区:程序员只负责编码
  3. CVPR 2019 | 基于密集语义对齐的行人重识别模型:有效解决语义不对齐
  4. 微型计算机没什么总线,微型计算机系统总线包括什么?
  5. 直击DatacenterDynamics2011北京会议
  6. Android四大组件之Activity组件
  7. jQuery 操作表单
  8. Go语言strings和strconv包
  9. 网络安全阶段一学习笔记
  10. Android接入极光消息推送
  11. 学Python编程好找工作吗?岗位方向多吗?
  12. 如何将.md文件转换为pdf
  13. TradingView--Charting Library是什么
  14. h5 神策埋点_前端 神策埋点那点事儿
  15. 处理大文件排序的方式--外部排序
  16. LeetCode1-500题汇总,希望对你有点帮助!
  17. Excel如何进行条件计数
  18. 日本PHP的线雕产品怎么样,欧茱丽线雕安瓶怎么样?欧茱丽线雕安瓶好用吗
  19. oracle表关联为什么不走索引,Oracle执行计划不走索引的原因总结
  20. oracle rac rman回滚,rac rman 备份和恢复 2

热门文章

  1. java 100万 100 最大 选出_面试真题:求100万内的质数
  2. CC2530的串口通信原理与应用
  3. 一切技能的习得都是刻意练习的结果
  4. js获取上个月月份、上个月第一天与上个月最后一天函数封装
  5. 高等概率论 Chapter 9. Integration with Respect to a Probability Measure1
  6. linux查杀minergate-cli/minerd病毒
  7. 【一起入门MachineLearning】中科院机器学习-期末题库-【计算题13+简答题3,22+单选题58,82+多选题19】
  8. 文献计量分析方法与工具
  9. java求乘法逆元的代码_求乘法逆元的几种方法
  10. 插入U盘老是弹出U盘扫描和提示修复提示怎么解 决