构造函数不可以是虚函数;析构函数可以是虚函数,也可以是纯虚函数。

一:构造函数不能声明为虚函数的原因

1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。
而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象 的实际类型,是该类本身,
还是该类的一个派生类,或是更深层次的派生类。无法确定。

2 虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,即初始化vptr,
让他指向正确的虚函数表。
而在构造对象期间,虚函数表还没有被初 始化,将无法进行。

二:析构函数可以是虚函数,也可以是纯虚函数

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

 class awov {public:virtual ~awov() = 0; // 声明一个纯虚析构函数};

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

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

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

虽然抽象类的析构函数可以是纯虚函数,但要实例化其派生类对象,仍必须提供抽象基类中析构函数的函数体。抽象类的纯虚函数的实现可以由自身给出,也可以由派生类给出。错了,除了析构函数外,其他函数都不行,必须要在派生类中进行实现

构造函数不可以是虚函数;析构函数可以是虚函数,也可以是纯虚函数。相关推荐

  1. 虚函数、纯虚函数、虚函数与析构函数

    一.虚函数 只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数.因为虚函数的作用是允许在派生类中对基类的虚函数重新定义.所以虚函数只能用于类的继承层次结构中. 一个 ...

  2. 静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数

    1.静态联编,是程序的匹配,连接在编译阶段实现,也称为早期匹配.重载函数使用静态联编. 2.动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编.switch语句和if语句是动态联编的例子. #i ...

  3. C++——虚函数、虚析构函数、纯虚函数、抽象类

    目录 一.虚函数 1.什么是虚函数? 2.虚函数的作用 3.虚函数的参数 4.虚函数代码示例 二.虚析构函数 1.什么是虚析构函数? 2.虚析构函数的作用 3. 构造函数 4.为什么构造函数不能是虚函 ...

  4. C++中虚析构函数和纯虚函数的作用

    一. 虚析构函数 为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数为虚函数.因为在delete一个抽象类指针时候,必须要通过虚函数找到真正的析构函数. class Base ...

  5. 析构函数可以为纯虚函数吗?纯虚函数可以有函数体吗?纯虚函数需要函数体吗?

    先回答标题中中的几个问题: 析构函数可以为纯虚函数吗? yes. 纯虚函数可以有函数体吗? yes. 纯虚函数需要函数体吗? 一般来讲,如果析构函数是纯虚函数,那么析构函数必须要有函数体,如果是其它函 ...

  6. c++中虚函数和纯虚函数定义

    只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数.因为虚函数的作用是允许在派生类中对基类的虚函数重新定义.所以虚函数只能用于类的继承层次结构中. 一个成员函数被声 ...

  7. C++ 虚函数与纯虚函数

    纯虚函数定义如下: virtual functionname (parameter ) =0 ; 类的一个成员定位虚函数的实际意义在于让C++知道该函数并无意义,它的作用只是为了让派生类进行函数重载保 ...

  8. C++_虚继承_虚函数_纯虚函数(多继承的二义性,多态)

    基本信息 每一个类都有一个虚表,以及虚表指针; 虚表的内容是编译器决定的,虚表中用于存放虚函数的指针, 程序运行时的类型信息等; 每个多态对象都存放着一个指向当前类型的虚表的指针, 该指针在构造函数中 ...

  9. 【C++】C++类的学习(五)——纯虚函数与抽象类

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 在前面的博客中讲到了虚函数,今天讲述一种特别的虚函数--纯虚函数,以及与之相关的抽象类 ...

最新文章

  1. Android通过百度地图API用Service和Alarm在后台定时获取地理位置信息
  2. python对数据进行分类_在Python中对一系列数据进行分类的最佳方法
  3. linux上还原自主nuget包需要注意的问题
  4. Powerful Sleep(神奇的睡眠-睡眠生物钟的秘密:如何睡得更少却睡得更好)阅读笔记...
  5. vant toast loading 倒计时_日期倒计时软件哪个好 苹果日期倒计时软件推荐
  6. 11.QT中同一个源文件对应两个不同的ui
  7. 不同设备监控图像传输方式分析
  8. 基于物品的协同过滤mysql_百万用户,八十万商品,如何计算基于物品的协同过滤...
  9. python 字符串 换行_Python基础教程——字符串
  10. linux中安装apk软件,Linux下安装软件的几种方式
  11. TCP和UDP的区别(简单明了)
  12. 基于WebRTC搭建直播系统源码
  13. 卡尔曼滤波原理及公式推导
  14. 三星,现代,中颖,合泰,松翰等单片机定时器溢出计算公式
  15. 解决谷歌浏览器最新chrome94版本CORS跨域问题
  16. cocos2dx-lua使用UIListView制作二级折叠菜单
  17. 数据挖掘::实验一 WEKA分类
  18. JS checkbox
  19. 成都农科院计算机专业考纲,成都农业科技职业学院2020高职单招考试内容
  20. 白热化的政务云市场,在等一个“六边形战士”

热门文章

  1. ASP.NET Core WebAPI中的分析工具MiniProfiler
  2. 【MFC】在CHtmlView中准确判断页面加载完成
  3. 启动一个线程是用run()还是start()?
  4. POJ 3264 Balanced Lineup
  5. asp.net播放声音
  6. Visual C++ 2011-5-27
  7. 中断和异常,陷阱的区别和联系
  8. 贝塞尔曲线(Bezier Curves)
  9. Cable:360实现的新虚拟网络架构
  10. 你是AI王者吗?2018人工智能专业期末考试,66666奖学金等你来