-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
🎉把您写的文章留下来🎉 #1
Comments
|
学习C++虚函数与动态多态性-喻建明 HEtinto 前言C++中的虚函数的主要作用是为了实现多态,通过了解虚函数的作用,可以帮助我们理解多态实现的原理。 虚表虚函数其实是通过一张虚表来实现的,称为V-Table,在这个表中,主要是一个类的虚函数的地址表。在有虚函数的类的实例中,虚表被分配在实例的内存之中,在使用父类指针来操作一个子类中存在的与父类中的成员函数同名的函数时,虚函数指针通过虚表实现动态绑定。 下面测试虚表所占用的内存空间大小:
输出结果:
虚表实际占用大小可能根据实际数据情况改变大小,这里只是验证其存在性。并且子类会继承父类的虚表,这样虚表同样会在子类实例中占用内存空间。 虚表的作用虚表用于存储类的实例化对象中虚函数函数地址,它可以动态地存储虚函数的子类的同名函数的地址,用于区分子类和父类的同名函数,实现动态绑定。 下面我们来实际看一看虚表所实现的动态绑定:
运行结果:
分析: 虚表实现动态绑定的存储方式下面给出父类的一个实例的虚表,(实际上,在子类继承了父类后,创建子类对象的同时,也会创建一个父类的对象,并调用父类的构造函数进行初始化):
下面给出子类的实例化对象的虚表及其函数地址:
下面给出虚表地址和虚表中函数地址的获取方法
**存储方式分析:**一个虚表将类的实例对象的虚函数函数地址按照声明顺序依次放在虚表之中。 实现方式:对于父类中的虚函数,在子类中若存在同名的函数,即可实现动态绑定,这时子类从父类中继承的虚表中的同名函数的地址就会替换为子类中的同名函数的地址;这样我们在调用时就不会调用父类的函数,而是调用子类的函数。 优劣分析优势: 缺点: 2.虚函数的安全性方面其实是有漏洞的,如果我们用父类的指针或者是引用指向子类的对象,而子类中存在不是重载父类虚函数的虚函数,我们想要通过父类的指针去访问子类自己的虚函数,那么这是非法的,但是我们可以通过指针的方式访问虚函数来达到违反C++语义的行为。
程序运行结果:
3.根据虚表的性质,我们容易知道,父类的虚函数会存在于子类的虚表之中,我们可以通过子类的虚表去访问父类的非公有虚函数。
运行结果:
##结语 5/16/2020 9:49:49 PM by yujianming |
分治算法-喻建明 HEtinto 思想分治法:在求解一个输入规模为n,而n的取值又很大的问题时,直接求解往往非常困难。这时,可以先分析问题本身所具有的某些特性,然后从这些特性出发,选择某些适当的设计策略来求解。 分治算法的思想是将一个复杂的问题分解成许多子问题,然后对子问题进行求解,子问题求解得出的结果将构成原来问题的解。 分治算法执行过程: 问题引入计算 x 的 n 次幂。 常规思路
这是一个递归求解思路,可以被程序正常调用和运行;但是随着程序的递归次数的增加,将会超过 python3 的最大递归深度(1000左右),运行将会报错。这里测试的是计算2的1024次方,运行结果显示超过最大递归深度
分析:递归程序会占用大量的内存空间,如果不设法提高递归程序的空间使用效率和运算效率,会对内存和算力造成很大的浪费。 ###分治实现 具体算法实现
执行上述代码可得出结果(结果较长这里只显示部分结果):
效率分析在第一种递归算法下,容易知道,程序进行的递归次数就是所求幂次的大小。 在第二种算法下,在计算 2 的 1024 次方时递归只进行了 10 次,而第一种算法需要进行 1024 次,采用分治思想的算法效率相比不采用分治处理的算法而言效率是很高的。 递归次数是10次的原因:程序中 N = 1024, 如果 N 不等于 0 或 1,执行递归 且令 N = N // 2,在第10次计算后 N = 1, 不再进入递归。下面给出实际测试代码:
分治算法经典问题
总结对于一个规模很大的问题,在进行直接求解时往往十分困难,但是问题本身可以分成若干个较小的问题,这些较小的问题相对于之前的问题而言更容易求解,然后通过合并这些较小问题的解得出原问题的解,这样对于提高程序效率具有很大的帮助。 |
学习感悟-刘樱桥 liuyingqiao2019 S: 入学到现在,也曾痛苦与迷惘过。途中最大的感悟便是--实践出真知,实践是提升技术最快的方法,学而不思则罔。 我曾用一周的时间学完C语言的基础知识,用2天是时间忘记,最终花了2个月的时间”复习“。也曾花两个月的暑假时间学习Python,直到被提问才发现,自己其实并没有掌握多少相关的知识点,只看书只看教程、缺乏一定的实践是学不好一门语言的。这时才突然发现”敲十万行代码才算入门某门语言“这句话似乎是有一定的道理的。当然,只搞项目,不去了解项目的原理,虽然做出来的项目很多,但那毕竟是参考别人的,不是自己的。 只有自己敲一遍代码,才能知道自己的漏洞在哪里,不足在哪里。比如说,我就有着多学一门语言,就容易将其把已经掌握的语言混杂起来。刚学JAVA时,我便会与C语言混淆,再学C++时,又会把C++和JAVA混淆。因此,我不得不花时间去辨析、区分两者语言及其结构的共同点与不同点,甚至于去研究两个数的交换的多种方法。仔细一想,其原因还是代码量不够。 学习途中不够专注。学着JAVA的同时,一会跑去捣鼓数据库,一会弄个Linux服务器练手。一时兴起就会这边看看那也瞅瞅。 以上,便是我从入学到现在所出现的坏毛病+踩的坑。 |
我们为什么会生病读书笔记-刘樱桥 liuyingqiao2019 R2: 前言全书共15章,属于生物类科技文。原本是打算看完再写的,但怕遗忘,现记录一下我的一些感想。另全书我只看到了第8章,第8章往后的内容我暂时不发表言论。 内容文章开篇声明了全书是从演化解释的角度去思考问题的,也就是以解答类似于为什么自然选择留下了这些基因,为什么人们会对某种疾病更易感之类的问题。全思路大致上是这样子的:首先,我们为什么会生病?从我们中学学过的高中知识可以知道,像类似感冒发烧这样的病因是因为机体遭遇了病毒的入侵。如今年的疫情,为什么吃蝙蝠的人生病了?因为蝙蝠携带的病毒入侵了人体,引发了发热、咳嗽等症状。那么,为什么让人们感染上的恰好是新型冠状病毒而不是其他病毒?换句话来说,为什么人们对新型冠状病毒这么易感?原因是人们自身携带的某种基因会对这个病毒出现易感现象。那么为什么自然选择没有把这个基因给剔除?ok,这个问题,就是这本书所要解决的问题,即关于起源和功能的问题。 首先呢,我们知道,大自然对人类身体的构造是相当精妙的。比如四肢长骨的架构为空心管状,在重量最小、材料最节约的情况下还同时具备了最大的强度和弹性,并且比同等重量的实心钢筋的强度高。但大自然在某些“设计”方面也出现一些失误和偏差:如我们的气管和食道在咽喉交叉,那么我们在吃饭的时候说话或者大笑,食物就会流入气管造成堵塞,严重些的后果甚至是死亡,即“噎死”。对于大自然种种精妙的设计之下,发生这种疏忽可以说是反常的,而这个机制为什么就没有被淘汰呢?为什么人类就不能像鱼一样,呼吸道与食道单独的分开? 自然选择不是一蹴而就的,是一点一点的慢慢的改变。不可能因为某一些的不合理设置就把所有东西都推倒重建。而像人类的呼吸道和食道的交叉问题,其实只要吃东西时不说话就能有效的减少伤亡。倘若人类同鱼一样让呼吸道与食道单独分开,那势必有着脖子过粗等弊端。曾在看到过这样一个问题:已知像车轮这种圆形的构造是最为省力的行走方式,那么为什么人类进化出来的不是车轮,而是腿呢?而在B站上曾看到过这一问题的动画解答诠释了自然选择这一点。为了省力,圆形可以简化为扇形。而为了适应各种地形凹凸不平的变化,在扇形的基础上,又增加了几条承重轴,久而久之,车轮的行走方式,在人类身上体现的,也正是腿的基本构造。这便是自然选择的力量,那么为何自然选择没有将某些基因剔除呢? 据研究显示,患有镰刀型贫血症的患者不容易感染疟疾。原因是引起镰刀型贫血症的基因同时具有防止疟疾的作用。那么当某地疟疾蔓延严重时,这些镰刀型贫血症的患者便生存了下来。即自然选择不会剔除对携带者有益处的基因。即引起对新冠病毒的易感现象的基因,在某个方面所表现的作用是对携带者有益的。 演化是一个渐进的过程,它没有跃进,只有微小的改变,而每一种改变都必须具有立竿见影的益处。尽管有着许多的基因会造成了一定的弊端,但也会带来更大的益处,因此才被自然选择留了下来。 |
(Markdown)格式:
类型标记有:A、R1、S、R2、W1、W2
详情请看正题部分:https://seveninnovationbasedoc.readthedocs.io/zh_CN/latest/Announcement/reading01.html
The text was updated successfully, but these errors were encountered: