虚析构函数_danneel_zhu的博客-程序员宝宝

技术标签: 联编  重载  虚析构函数  多态  虚函数  

多态:

字面意思:多种形态,在编程中指的是同样的消息(成员函数等)被不同的对象接受时导致的完全不相同的行为的一种现象。

联编:

确定程序中操作与执行该操作的代码段之间的映射关系。(简单来说就是你妈说你可以吃糖,联翩就是绑定你吃的是哪种糖,硬糖还是软糖)

多态的分类:

编译时多态:通过静态联编,也叫早期绑定,在编译阶段进行。

现象:函数重载和操作符重载,隐藏等。

运行时多态:通过动态联编,也叫晚期绑定,在运行时确定。

现象:switch if等,在c++类对象中动态联编必须通过继承,虚函数,和指针(引用)来完成。

一个例子:

#include<iostream>
using namespace std;
class baseclass{
    public:
    baseclass(){
        cout<<"base constructor"<<endl;
    }
    public :
    ~baseclass(){
        cout<<"base destructor"<<endl;
    }
};

class childclass:public baseclass{
    public:
    childclass(){
        cout<<"childcalss constructor"<<endl;
    }
    pubic :
    ~childclass(){
        cout<<"childless destructor"<<endl;
    }
};

int main(){
    base class *p = new childclass;
    delete p;
    return 0;
}

运行结果:
baseclass constructor
childclass constructor
baseclass destructor

//运行结束,但是没有调用子类的析构函数,导致内存泄漏。这是因为,程序中虽然有存在的指针和继承的关系,但是缺少了虚函数,所以这不是一个真正意义上的运行时多态,编译器根据指针类型(baseclass类)来调用析构函数。



//当添加virtual的时候,baseclass的析构函数被重写,从而可以正常的析构。


#include<iostream>
using namespace std;
class baseclass{
    public:
    baseclass(){
        cout<<"base constructor"<<endl;
    }
    public :
    virtual~baseclass(){
        cout<<"base destructor"<<endl;
    }
};

class childclass:public baseclass{
    public:
    childclass(){
        cout<<"childcalss constructor"<<endl;
    }
    pubic :
    ~childclass(){
        cout<<"childless destructor"<<endl;
    }
};

int main(){
    base class *p = new childclass;
    delete p;
    return 0;
}

运行结果:
baseclass constructor
childclass constructor
childclass destructor
baseclass destructor

//实际上作为基类的析构函数一般都被写成虚析构函数


all

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/danneel/article/details/71055710

智能推荐

下列选项中,不可能是快速排序第2趟排序结果的是( ),【2014年全国试题11 (2分)】_Anthony_4926的博客-程序员宝宝_不可能是快速排序第二趟排序结果的是

下列选项中,不可能是快速排序第2趟排序结果的是(),【2014年全国试题11 (2分)】A. 2, 3, 5, 4, 6, 7,9B. 2, 7, 5, 6, 4, 3,9C. 3, 2, 5, 4, 7, 6,9D. 4, 2, 3, 5, 7, 6,9解析:快排一趟完成后,会有一个中间值,左边比它小,右边比它大。第二趟完成后,在左半还会找到一个中间值,左边比它下,右边比它大。右半同理首先我们根据选项,找这个值,如果找不到,说明这个选项肯定不是。先说...

PChart使用经验_zmn320203的博客-程序员宝宝_ppchart

前几天写了个web,来统计测试结果,因为数字没有图形来的直观,所以网上搜索了下发现PChart是个好东西,易于上手也比较好看。现在的PCahrt已经到2.1.3了,大概10多个class类。下面几个步骤来生成pchart图表,有兴趣的朋友一起研究研究。1. 先写个函数来fetch data 从数据库。$q=$_GET["q"];my_chart($q);function my_ch

Exchange server 2010 beta安装部署流程_weixin_33730836的博客-程序员宝宝

本文使用了微软公开发布的exchange server 2010 beta进行部署测试。这篇文档将用到下列产品windows server 2008 64bit enterpriseAD function at windows server 2008exchange server 2010 beta----------该exchange...

【Unity3d Shader】ugui image的双面渲染_PangNanGua的博客-程序员宝宝_ugui image 正面 背面

最近在做一款卡牌游戏,需要模拟类型扑克牌的运动动画,运动过程中可能显示牌的正面,也可能显示背面。那么需求来了,要实现一个支持双面渲染的shader,效果如下:转动过程中自动切换牌的正反面。核心思想如下:frag()函数里面传入一下VFACEif (vface &gt; 0) 渲染正面;else 渲染背面;核心代码如下:fixed4 frag(v2...

linux脚本冒号,Shell中的冒号 :_尽是远方的博客-程序员宝宝

{str:=expr}如果变量str不为空,${str:=expr}就等于str的值,若str为空,就把expr的值赋值给str。用途说明我们知道,在Linux系统中,冒号(:)常用来做路径的分隔符(PATH),数据字段的分隔符(/etc/passwd)等。其实,冒号(:)在Bash中也是一个内建命令,它啥也不做,是个空命令、只起到占一个位置的作用,但有时候确实需要它。当然,它也有它的用途的,否则...

[转]关于 initWithNibName 和 loadNibNamed 的区别和联系_weixin_30847271的博客-程序员宝宝

转载地址:http://jianyu996.blog.163.com/blog/static/1121145552012102293653906/关于 initWithNibName和 loadNibNamed的区别和联系。之所以要把这两者来一起讲,我觉的我也有点困惑,到底用那种?其实真正搞清楚了他们之间的差别,就不会这么迷惘了。因为这两个方法,根本就不是一路货色。既然,是要说明...

随便推点

mysql8.0 sql_mode操作_诸葛老刘的博客-程序员宝宝_mysql8 sql_mode

文章目录前置条件:问题及其解决方案:前置条件:mysql版本: 8.0安装方法: docker安装使用状态: PC本地可以远程连接docker 安装mysql:8.0 , docker 安装mysql:5.7 问题及其解决方案:1 date数据类型 不能置为0000-00-00 00:00:00已尝试方案:mysql5.7的sql_mode操作, 未能解决问题通过各种...

Linux 命令_weixin_33827965的博客-程序员宝宝

◆ 安装和登录命令:login、shutdown、halt、reboot、install、mount、umount、chsh、exit、last;◆ 文件处理命令:file、mkdir、grep、dd、find、mv、ls、diff、cat、ln;◆ 系统管理相关命令:df、top、free、quota、at、lp、adduser、groupadd、kill、crontab;◆ 网络操...

这个17岁的黑客天才,破解了第一代iPhone!_程序员小灰的博客-程序员宝宝

时间来到2007年,第一代的ipone问世惊艳了世人,重新定义了智能手机。但第一代的iPhone也有让人恼火的地方,当时的iPhone和AT&amp;T(当时美国最大的移动运营商)签了五...

1995年 安全事件_weixin_34175509的博客-程序员宝宝

八、1995年安全事件1.     1995年2月世界头号米特尼克***被捕2月15日,Kevin Mitnick在北卡罗莱纳州Raleigh市被捕。Mitnick被控***一系列计算机网络和盗窃两万个信用卡号码以及复制软件程序。3月,俄国***Vladimir Levin在英国被捕,被控利用计算机将至少370万美元的资金非法转到世界各地的账户上。 2.     1995年8月微软...

Java基础学习笔记三 正则表达式和校验、Date、DateFormat、Calendar_weixin_34149796的博客-程序员宝宝

正则表达式正则表达式(英语:Regular Expression,在代码中常简写为regex)。正则表达式是一个字符串,使用单个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。正则表达式的匹配规则参照帮助文档,在Pattern类中有正则表达式的的规则定义,正则表达式中明确区分大小写字母。我们来学习语法规...

CI3.x的model加载解析_pigfu的博客-程序员宝宝_ci 模型加载

本文基于CI3.x,介绍了它的model(CI_Model)加载机制,即从Xxxx_Controller到Xxx_Model到DB函数的机制。

推荐文章

热门文章

相关标签