多态性实现机制

合集下载

虚函数的多态性机制分析

虚函数的多态性机制分析
I N 0 9 3 4 SS 1 0 - 0 4
E ma : s @c c .e C — i xj c c t n l l n .
ht /www. z .e .n t / p: dn sn tc
C m u r n we g n e h o g o p t o l ea dT c n l y电脑 知 识 与技术 eK d o

1面 向对 象 程 序 设 计 的 多 态 性
在C+ , + 中 把类 看 作 类 型 , 以 p bi 式 继 承 的派 生 类 看 作是 基 类 的 子类 型 。从 而 产生 了多 态 对象 的类 型 不但 可 以是 派生 类 , ) 也可 以是 基类 , 也就是 说 , 个对 象 可 以 属 于 多种 类 型 。 一 2 基 类 的指 针 可 以 指 向基 类 对 象 , 可 以 指 向派 , 类 对象 ; ) 也 } - 基类 的 引用 可 以引 用 基 类 对 象 , 可 以引 用 派 生类 对 象 即一 个 对 也
象标 识 符 可 以属 于 多 种类 型 , 可 以标 识 多种 对 象 它
3 一 个 消息 可 以发 送 到 基 类 对象 , 可 以发 送 到 派 生类 刘 象 , 而 可 能 会得 到 不 同 的 解 释 , ) 也 从 引起 不 同的 动作 , 产生 不 同的 效果
C + 以 支持 两 种 多 态性 : +可 静态 多 态 性 和动 态 多 态 性 我们 知 道 , 序 在 运 行 前 的编 译 连 接 阶段 会 根据 源 程 序 中的 要 调 用 的 函 程
Abtat I jc— i ne rga migtelhfac eettig o r ci l hn me o el r . th oy rh s c: nOb t Or tdPorm n , n et erfc n s f ea hc e o n ni r l b e P l r e e h in l sh h r a p n a wo d u t mop —

c++虚函数作用及底层原理

c++虚函数作用及底层原理

c++虚函数作用及底层原理C++是一种面向对象的编程语言,并支持多态性的实现。

其中,虚函数是C++中实现多态性的主要机制之一。

虚函数是一种特殊的成员函数,可以在派生类中重写,并通过基类指针或引用的间接方式调用派生类的实现。

虚函数的作用:1. 实现动态绑定:实现多态性的关键是在运行时确定函数的具体实现。

虚函数通过将函数调用的确定延迟到运行时,而不是在编译时确定,从而实现动态绑定。

2. 多态性:允许派生类重写基类的函数,并使用基类指针或引用调用派生类的实现。

这种多态性的实现可以增强代码的灵活性和可重用性。

3. 实现抽象类:虚函数也可以用于实现抽象类,即只声明函数接口而没有实现。

这样,派生类必须实现虚函数才能被实例化。

虚函数的底层原理:虚函数的实现需要两个关键组件:虚函数表(vtable)和虚函数指针(vptr)。

1. 虚函数表:每个包含虚函数的类都有一个虚函数表,其中包含了类中所有虚函数的地址。

虚函数表是一个静态数据结构,只有一个虚函数表,且在编译时生成。

2. 虚函数指针:每个包含虚函数的类的对象都有一个虚函数指针,指向其所属类的虚函数表。

虚函数指针是一个指向虚函数表的指针,指针的值在程序运行时动态确定。

当调用虚函数时,程序首先通过对象的虚函数指针找到其所属类的虚函数表,然后查找相应的虚函数地址,最终调用正确的虚函数实现。

这样,虚函数的实现在运行时动态确定,实现了动态绑定和多态性。

总之,虚函数是C++中实现多态性的主要机制之一,通过虚函数表和虚函数指针的使用,实现了动态绑定和多态性的实现。

虚函数的应用可以增强代码的灵活性和可重用性。

基因多态性的影响及遗传机制研究

基因多态性的影响及遗传机制研究

基因多态性的影响及遗传机制研究遗传学是一门致力于研究遗传规律、遗传现象和基因多态性等科学的综合性学科。

基因多态性指的是人类基因组对同一基因的不同变异型,其中的DNA序列有可能影响性状变异,极大程度地影响个体的生物多样性和健康状况。

基因多态性的影响人类基因组中的几乎所有基因均存在多个突变位点,这些位点可以影响覆盖该基因的转录因子的结合性质、启动子活性等,决定了基因转录的数量和速度。

基因多态性的不同变异型具有不同的功能,而这种功能多态性意味着在表达和/或相互配对时,它们对化学信号的响应以及同一物种的个体间的生命系统变化显著不同。

这就表明了基因多态性是一个显著地影响个体生命质量和健康状况的因素。

基因多态性的影响范围已经覆盖到了从心血管疾病、癌症和代谢性疾病到帕金森病、自闭症等复杂性疾病,上至儿童时期的发育问题,下至老年时期的肺癌等问题,多种疾病和障碍都与基因多态性有直接和间接联系。

基因多态性的遗传机制基因多态性是基因组中一种常见的自然现象。

多种突变机制都有可能导致基因多样性。

它们在遗传决定中的作用可能是常染色体隐性、常染色体显性或性染色体中的基因移位或嵌合。

其中,常见的基因多态性通常与单核苷酸多态性(SNP)有关。

SNP是指基因组中频率至少为1%的不同单个核苷酸变异,通常以单个碱基互换为主,也涉及几十个碱基段的差异。

最近,人们对SNP的分析及其与疾病和健康有关的机制做了很多工作。

SNP的数量非常大,质量也受到了精细处理,在全球范围内也建立了SNP数据库,为SNP研究提供了宝贵的资源。

通过对多个单核苷酸多态性(SNP)进行基因分型,可以识别以前没有注重或检测的人类基因多态性,这有助于将基因多态性描述为更复杂的遗传过程。

结语基因多态性的研究在医学、生物学、人类学和遗传学等领域都有大量的应用。

基因多态性也成为了一个新的研究方向,其背后包含了量子、计算生物学、生物医学工程学等多个学科的知识。

虽然我们还有很多需要了解和学习的东西,但正是这种不断探索和深入研究的方式推动了领先科学家们的新一轮创新和发现。

生物学中的遗传多态性研究

生物学中的遗传多态性研究

生物学中的遗传多态性研究遗传多态性作为一种遗传变异形式,是指基因在种群中存在多种等位基因的现象。

它在生物学中是一个非常重要的研究方向,因为遗传多态性不仅是生物种群进化的基础,也是生物学各个领域中的重要研究对象。

本文将介绍遗传多态性的概念、发生机制以及在生物学中的应用。

一、遗传多态性的概念遗传多态性(genetic polymorphism)是指在种群中的某一基因有两种或两种以上的等位基因,在一定条件下每种等位基因的频度都大于0.01。

这个概念最初是由英国的遗传学家弗雷德里克·格里菲斯提出的。

遗传多态性是基因水平上的表型变异,通过不同等位基因的组合而表现出来。

在人类学、动物学和植物学等领域中,遗传多态性都是一个非常重要的指标。

在人类学中,遗传多态性可以用来进行人类种群进化和迁徙的研究;在动植物学中,遗传多态性可以用来研究物种的起源、退化、适应性以及遗传资源等方面问题。

二、遗传多态性的发生机制遗传多态性在种群进化中的产生有多种机制。

其中,常见的机制有自然选择、基因漂变、基因流和突变等。

自然选择是指环境对不同等位基因的选择作用,使得一些等位基因被淘汰而另一些等位基因得以保留和扩散。

基因漂变是指由于随机的繁殖和变异过程,等位基因的频率发生了漂移的现象。

基因流是指不同种群之间等位基因的转移,这个过程会导致物种群体的基因组成发生改变。

突变是指基因产生的随机变异,这种变异可以导致等位基因的增加或丢失,从而增加遗传多样性。

三、遗传多态性在生物学中的应用1. 遗传多态性与人类疾病遗传多态性在医学中有着广泛的应用。

通过研究人类基因的多态性,可以发现一些跟疾病相关的基因,从而提高人们对疾病的认识和防治能力。

例如,某些人群中有一个名为APOE的基因,它与阿尔茨海默病有一定的关联,人们可以通过检测APOE基因的多态性来判断是否有患上阿尔茨海默病的风险。

2. 遗传多态性与生态保护遗传多态性也被广泛应用于生态保护领域,尤其是对于野生动物和植物。

继承、多态,重载、重写的区别与总结

继承、多态,重载、重写的区别与总结

继承、多态,重载、重写的区别与总结李氏原则:(1)父类的引用指向子类对象。

-多态(2)接口的引用指向实现类的实例。

-接口Polo咯,什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承、多态、重载和重写继承(inheritance)简单的说,继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(下面会讲到,这种方式叫重写)的方式,产生一个新的类型。

继承是面向对象的三个基本特征--封装、继承、多态的其中之一,我们在使用JAVA 时编写的每一个类都是在继承,因为在JAVA语言中,ng.Object类是所有类最根本的基类(或者叫父类、超类),如果我们新定义的一个类没有明确地指定继承自哪个基类,那么JAVA就会默认为它是继承自Object类的。

我们可以把JAVA中的类分为以下三种:类:使用class定义且不含有抽象方法的类。

抽象类:使用abstract class定义的类,它可以含有,也可以不含有抽象方法。

接口:使用interface定义的类。

在这三种类型之间存在下面的继承规律:类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。

抽象类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。

接口只能继承(extends)接口。

请注意上面三条规律中每种继承情况下使用的不同的关键字extends和implements,它们是不可以随意替换的。

大家知道,一个普通类继承一个接口后,必须实现这个接口中定义的所有方法,否则就只能被定义为抽象类。

我在这里之所以没有对implements关键字使用“实现”这种说法是因为从概念上来说它也是表示一种继承关系,而且对于抽象类implements接口的情况下,它并不是一定要实现这个接口定义的任何方法,因此使用继承的说法更为合理一些。

多态的实现原理

多态的实现原理

多态的实现原理多态是面向对象编程中的一个重要概念,它允许不同类的对象对同一消息做出不同的响应。

在实际编程中,多态性使得我们可以编写出更加灵活、可扩展的代码。

那么,多态的实现原理是什么呢?首先,我们需要了解多态的两种实现方式,静态多态和动态多态。

静态多态是通过方法的重载和重写来实现的,而动态多态则是通过继承和接口实现的。

静态多态是指在编译期间确定调用的方法,主要是通过方法的重载和重写来实现。

方法的重载是指在同一个类中,方法名相同,但参数列表不同,编译器根据参数列表的不同来确定调用哪个方法。

方法的重写是指子类重新定义了父类中已有的方法,通过父类引用指向子类对象时,调用的是子类中的方法。

动态多态是指在运行时确定调用的方法,主要是通过继承和接口实现的。

通过继承,子类可以继承父类的方法,并且可以对其进行重写,从而实现多态。

通过接口,不同的类可以实现相同的接口,并且可以根据具体的实现类来确定调用的方法。

多态的实现原理主要是通过虚方法表(vtable)和虚函数指针(vptr)来实现的。

在面向对象编程中,每个类都有一个虚方法表,其中存储了该类的虚函数地址。

当一个类包含虚函数时,编译器会在该类的对象中插入一个指向虚方法表的指针,即虚函数指针。

当调用虚函数时,实际上是通过虚函数指针来查找虚方法表,从而确定调用的是哪个函数。

总结一下,多态的实现原理主要是通过静态多态和动态多态两种方式来实现的。

静态多态是通过方法的重载和重写来实现的,而动态多态是通过继承和接口实现的。

在底层,多态是通过虚方法表和虚函数指针来实现的,通过这两种机制来确定调用的方法。

多态使得我们可以编写出更加灵活、可扩展的代码,提高了代码的复用性和可维护性。

在实际编程中,我们应该充分利用多态的特性,编写出更加灵活、可扩展的代码。

同时,深入理解多态的实现原理,对于我们提高编程水平,设计更加优雅的系统架构也是非常有帮助的。

希望本文对大家对多态的实现原理有所帮助,谢谢阅读!。

java多态性

java多态性

Java的多态性面向对象编程有三个特征,即封装、继承和多态。

封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。

继承是为了重用父类代码,同时为实现多态性作准备。

那么什么是多态呢?方法的重写、重载与动态连接构成多态性。

Java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同,后者允许多继承,这确实给其带来的非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,派生类与基类间有IS-A的关系(即“猫”is a “动物”)。

这样做虽然保证了继承关系的简单明了,但是势必在功能上有很大的限制,所以,Java引入了多态性的概念以弥补这点的不足,此外,抽象类和接口也是解决单继承规定限制的重要手段。

同时,多态也是面向对象编程的精髓所在。

要理解多态性,首先要知道什么是“向上转型”。

我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。

我可以通过Cat c = new Cat();实例化一个Cat的对象,这个不难理解。

但当我这样定义时:Animal a = new Cat();这代表什么意思呢?很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。

由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。

那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。

c++自考题库及答案

c++自考题库及答案

c++自考题库及答案C++自考题库及答案1. 问题:C++中的构造函数和析构函数有什么区别?答案:构造函数用于在创建对象时初始化对象,它与类名相同,没有返回类型,且不能被显式调用。

析构函数用于在对象生命周期结束时进行清理工作,它与构造函数名称相同但前面加上波浪号(~),同样没有返回类型,也不能被显式调用。

2. 问题:C++中的类和结构体有什么区别?答案:在C++中,类和结构体在语法上几乎相同,但默认的访问权限不同。

类成员默认是私有的,而结构体成员默认是公开的。

此外,类可以有继承、多态等面向对象的特性,而结构体则没有。

3. 问题:什么是C++中的友元函数?答案:友元函数是一个可以访问类的私有和保护成员的非成员函数。

它通过在类定义中使用`friend`关键字声明。

4. 问题:C++中的运算符重载是什么?答案:运算符重载允许程序员定义或修改已有运算符对用户定义类型(如类或结构体)的操作。

这可以通过运算符函数实现,运算符函数是一个特殊的成员函数或友元函数,它重定义了运算符的行为。

5. 问题:C++中的继承有哪些类型?答案:C++中的继承主要有三种类型:公有继承(public inheritance)、保护继承(protected inheritance)和私有继承(private inheritance)。

公有继承是最常见的形式,基类的公有和保护成员在派生类中仍然是公有和保护的。

保护继承使得基类的公有和保护成员在派生类中变为保护的。

私有继承则将基类的公有和保护成员变为派生类的私有成员。

6. 问题:C++中的多态性是如何实现的?答案:多态性在C++中主要通过虚函数实现。

虚函数允许基类中的函数在派生类中被重写,这样同一个函数调用可以有不同的行为,取决于对象的实际类型。

7. 问题:C++中的模板是什么?答案:模板是C++中一种参数化类型或值的机制,允许程序员编写通用的代码,可以用于不同的数据类型。

模板可以是函数模板或类模板。

面向对象程序设计中的多态性

面向对象程序设计中的多态性

面向对象程序设计中的多态性随着计算机科技的飞速发展,程序设计语言也逐渐变得多样化,面向对象程序设计作为当前最受欢迎的程序设计范式之一,其最重要的特征之一就是多态性。

多态性指的是同一操作作用于不同的对象上面,可以有不同的实现,即同一种行为方式在不同的情形下具有不同的行为结果。

在面向对象的世界里,类别就好比是一个集合,它封装了一些数据和函数,并且控制了这些数据和函数的访问权限。

多态性就是采用不同的对象,用同样的方法去执行不同的行为。

这种机制可以使得程序结构更加灵活,更有扩展性和可维护性,因此多态性在面向对象程序设计中发挥着重要的作用。

下面我们将从多种角度来探讨面向对象程序设计中的多态性:1. 静态多态性和动态多态性在程序设计中,多态性分为静态多态性和动态多态性。

静态多态性是指在编译期就可以确定调用哪个方法,而动态多态性是在运行期才决定调用哪个方法。

静态多态性主要体现在函数重载和运算符重载中,而动态多态性则主要体现在虚函数、接口和抽象类等方面。

例如,一个Person类的方法setName()可以有多个版本,如setName(String name)和setName(String firstName,\String lastName)等。

编译器可以根据参数类型和参数个数来确定调用哪个版本的setName()方法,这就是静态多态性。

而当涉及到继承、重写和虚函数时,就需要动态多态性。

在这种情况下,如果一个类继承了父类,并重写了父类的某个方法,那么在运行时,调用的就是子类中定义的方法,而不是父类中的方法。

这种机制可以使编程更具灵活性,同时也方便了程序的维护和更新。

2. 多态性的好处多态性有很多好处。

首先,它让我们可以用更简洁的代码实现更复杂的功能。

例如,我们可以使用一个“动物”类来描述所有的动物,而不用去管不同动物之间复杂的关系。

这样就避免了大量的重复代码和不必要的麻烦。

其次,多态性也有利于程序的扩展和维护。

生物遗传中的基因突变与多态性

生物遗传中的基因突变与多态性

生物遗传中的基因突变与多态性生物体的遗传性状是由基因决定的,而基因又是由一条或多条DNA序列编码而来的。

基因的突变和多态性是生物演化和生物种群的形成过程中非常重要的遗传变异形式。

既有它们的利用价值,又有它们的适应性缺陷。

因此,了解基因突变和多态性的原理是生物遗传学研究中不可或缺的基础。

基因突变与多态性的定义基因突变是指对基因序列进行的一系列次生改变。

这些次生改变包括单个核苷酸的改变、插入或删除、重复或翻译错误的突变等等。

而基因多态性则是指同一个位置的基因序列,由于不同的个体间存在细小的序列差异而产生的遗传变异。

基因突变和多态性是生物体塑造形态和功能多样性的基础。

基因突变和多态性的原理基因突变和多态性的发生机制是非常复杂且多样的。

然而,大部分的基因突变和多态性可以概括为以下几类。

第一类是自然选择。

自然选择是一种自然界由于环境适应而产生的机制。

在生命演化的过程中,个体之间存在着不同的表现型,有些表现型比其他表现型更适应环境,自然选择可以使这些适应性表现型得以保存下来,而其他表现型则被淘汰或较少。

第二类是突变和多态性。

在基因复制和转录过程中,个体的基因序列会发生未知突变,在后代中产生多态性。

这种变异能够创造新的表现型,有些新表现型可能是更适应环境的,自然选择会保存下来,也可能有些新表现型是弱化的,这种情况更可能出现再生障碍、疾病和致命的后果。

第三类是基因拼合和扩增。

基因拼和基因扩增是两种重要的基因多态性产生机制,它们可以使新的基因序列产生局部性的增加或全基因库的扩增。

在基因拼合和扩增的过程中,新的基因序列会通过自然选择和随机漂移等机制产生变异,形成新的遗传多样性。

基因突变和多态性的应用价值基因突变和多态性在遗传学和进化生物学中有着重要的应用价值。

例如,基因突变和多态性可以被用来检测人类疾病和疾病的易感性,可以被用来确定个体和生物种群的亲缘关系,可以被用来研究生物进化和演化的过程。

基因突变和多态性还可以被用来研究生物个体和群体的分化和适应性。

基因多态性的生物学功能和调控

基因多态性的生物学功能和调控

基因多态性的生物学功能和调控基因是控制生物个体遗传性状的基本单位。

基因多态性是指在人类或其他生物个体的基因组中,同一基因具有不同等位基因的存在。

这种基因多态性造成了生物个体间基因型和表型的差异,进而导致生物在适应环境变化中的差异性。

基因多态性对个体生长、发育、代谢、疾病易感性等多个生物学过程具有影响。

基因多态性的生物学功能基因多态性对个体生物学功能和表现具有显著影响。

举例来说,ATP-binding cassette sub-family B member 1 (ABCB1)基因C3435T的基因多态性与药物的转运有关。

C3435T基因位于ABCB1基因上,它对药物跨过血管内皮细胞和神经细胞膜具有影响,因此影响药物的生物利用度、血浆浓度和药物毒性。

另一例如肝细胞生长因子基因-1(HGF-1)基因的多态性,它参与肝脏和肾脏组织的生长和维护。

在肝脏或肾脏遭受损伤时,HGF可激活内皮细胞增殖,发生分化,刺激细胞迁移,促进相邻组织的再生修复。

HGF-1基因多态性与肿瘤的易感性、肝病和肾病的发生有关。

因此,基因多态性对于生物在疾病代谢和修复、环境适应和行为心理等方面具有重要功能。

基因多态性调控机制基因多态性的调控机制包括基因突变和重组。

基因突变主要是指基因序列发生缺失,添加,或改变的一种方式。

基因突变在基因的复制、转录和翻译中产生不稳定的结构,直接导致基因功能的改变。

基因重组则指新的等位基因的形成,即DNA序列在两个亲本基因组中随机重组集成新基因。

基因重组在基因多样性和进化中起重要作用。

此外,基因多态性在生物进化中具有至关重要的作用。

生物进化需要资源重分配,躲避捕食和适应环境改变等自然选择机制。

在这些进化过程中,基因多态性是为生物体提供适应性的基础。

基因多态性也对人类行为和心理性状具有影响,如预测反应、认知和情感,以及毒品成瘾和心理疾病等。

基因多态性的未来方向基因多态性的未来研究可以深入探究基因的作用、进化和表现的机制,并改善预防和治疗基于基因多态性的疾病。

【转】什么是多态,怎样实现多态

【转】什么是多态,怎样实现多态

【转】什么是多态,怎样实现多态C++中多态是怎样实现的?多态是⼀种不同的对象以单独的⽅式作⽤于相同消息的能⼒,这个概念是从⾃然语⾔中引进的。

例如,动词“关闭”应⽤到不同的事务上其意思是不同的。

关门,关闭银⾏账号或关闭⼀个程序的窗⼝都是不同的⾏为;其实际的意义取决于该动作所作⽤的对象。

⼤多数⾯向对象语⾔的多态特性都仅以虚拟函数的形式来实现,但C++除了⼀般的虚拟函数形式之外,还多了两种静态的(即编译时的)多态机制:1、操作符重载:例如,对整型和串对象应⽤ += 操作符时,每个对象都是以单独的⽅式各⾃进⾏解释。

显然,潜在的 += 实现在每种类型中是不同的。

但是从直观上看,我们可以预期结果是什么。

2、模板:例如,当接受到相同的消息时,整型vector对象和串vector对象对消息反映是不同的,我们以关闭⾏为为例:vector < int > vi; vector < string > names;string name("VC知识库");vi.push_back( 5 ); // 在 vector 尾部添加整型names.push_back (name); // 添加串和添加整型体现差别的潜在的操作静态的多态机制不会导致与虚拟函数相关的运⾏时开。

此外,操作符重载和模板两者是通⽤算法最基本的东西,在STL中体现得尤为突出。

那么接下来我们说说以虚函数形式多态:通常都有以重载、覆盖、隐藏来三中⽅式,三种⽅式的区别⼤家应该要很深⼊的了解,这⾥就不多说了。

许多开发⼈员往往将这种情况和C++的多态性搞混淆,下⾯我从两⽅⾯为⼤家解说:1、编译的⾓度C++编译器在编译的时候,要确定每个对象调⽤的函数的地址,这称为早期绑定(early binding)。

2、内存模型的⾓度为了确定对象调⽤的函数的地址,就要使⽤迟绑定(late binding)技术。

当编译器使⽤迟绑定时,就会在运⾏时再去确定对象的类型以及正确的调⽤函数。

虚函数的多态性机制分析

虚函数的多态性机制分析

R c nl (o be my, e t ge d u l l a
例 1以 下程 序演 示静 态 联编 . 该程 d u l my {= lW= y } o be w)L my; m w; d u l ae ( o s { tr o be ra )c nt r un e
< 函数 体> 其 中 .iu l 关键 字 , 定 义该 函 v ta 是 r 它
数 是 虚 函 数
Fg r( { ; i e)} u
du l ae ( o s rtr o be ra )c nt{ un e } ;
ca s C r l l s ic e : p b i F g r ul c i e u

2 虚 函数
有 了虚 函数 . 使 得动 态 联 编成 为 就
可能 . 可 以在 基类 和派 生类 之 间 实现 就
动 态 多 态 性
/ 程序 例 子. p / c p / 静态联 编 的问题 /
椭n ld <o te m> eu e isra c n td u l I .4; o s o be P =31
u ig n mep c t sn a s a e sd;
在 程 序 代 码 中 使 用 vr a 来 指 明 i ul t
某个 成员 函数 是 虚 函数 虚 函数 的定义 格式 :
cas Fg r ls i e u
/ 定 义 基 类 /

p bi ul c:
vr a ( 回 值 类 型 ) 函 数 名 ) i ul 返 t ( 00 } .;
如 果 编 程 者 把 某 类 中 的一 个 或 多
那 译 连 接 阶段 会 根 据 源程 序 中 的 要 调 用 个 成 员 函数 定义 为 虚 函数 . 么该 成 员

列举java中多态的体现

列举java中多态的体现

列举java中多态的体现多态是面向对象编程中的一个重要概念,它允许不同的对象对同一消息做出不同的响应。

在Java中,多态性是通过继承和接口实现来实现的。

下面将列举Java中多态的体现。

一、方法重载方法重载是指在同一个类中定义了两个或两个以上名称相同但参数类型或个数不同的方法。

这种情况下,当调用该方法时,编译器会根据参数类型和个数来判断应该调用哪个方法。

这种方式就是Java中最基本的多态性体现。

二、方法覆盖方法覆盖是指子类重新定义了父类中已有的方法,并且子类和父类中该方法具有相同的名称、返回值类型和参数列表。

当使用父类引用变量引用子类对象时,调用该方法时会自动调用子类中定义的那个方法,而不是父类中定义的那个方法。

三、向上转型向上转型是指将子类对象赋值给父类引用变量。

这种情况下,可以通过父类引用变量来访问子类对象中继承自父类的成员变量和成员方法。

由于向上转型后只能访问到父类中定义的成员变量和成员方法,因此无法直接访问子类中定义的成员变量和成员方法。

四、动态绑定动态绑定是指在运行时根据对象的实际类型来确定调用哪个方法。

在Java中,所有的非私有方法都是动态绑定的,也就是说,当调用一个非私有方法时,编译器不会确定要调用哪个方法,而是等到运行时才根据对象的实际类型来确定要调用哪个方法。

五、抽象类和接口抽象类和接口也是Java中多态性的体现。

抽象类和接口都定义了一些规范,而具体实现则由子类来完成。

当使用父类引用变量引用子类对象时,可以通过父类引用变量来访问子类对象中实现了父类或接口中定义的规范的成员变量和成员方法。

六、多态数组多态数组是指数组中存储的元素可以是不同类型的对象。

在Java中,可以使用Object类型来定义一个多态数组,在运行时将不同类型的对象存储到该数组中。

由于Object类型是所有类型的父类,因此可以使用父类引用变量来访问存储在数组中的不同类型的对象。

七、泛型泛型也是Java中多态性的一种体现方式。

DNA等位基因多态性遗传规律解读

DNA等位基因多态性遗传规律解读

DNA等位基因多态性遗传规律解读DNA等位基因多态性是指同一基因座上存在两个或以上等位基因。

等位基因多态性的存在在基因组范围内是普遍的,它对物种的多样性和适应性起着重要的作用。

本文将侧重解读DNA等位基因多态性的遗传规律,探讨其在个体间分布、遗传传递和进化中的重要性。

DNA等位基因多态性是由基因突变等因素产生的。

基因突变是指产生新等位基因或改变现有等位基因表达的DNA序列变异。

基因突变可以分为点突变、插入/缺失、倒位和复制等类型。

这些突变事件导致了等位基因多样性的产生,从而为物种的适应性演化提供了基础。

在个体间分布上,等位基因多态性通常表现为多态基因频率,即不同等位基因在一个群体或种群中的比例。

在同一种群中,多态基因频率常常呈现正态分布,这表明群体中个体的基因型是多样且连续的。

多态基因频率的分布受到多种因素的影响,包括自然选择、突变、基因漂变和迁移等。

遗传传递是等位基因多态性的重要表现形式。

通过遗传传递,等位基因多态性可以在个体之间传递并维持下去。

常见的遗传传递方式有孟德尔遗传、连锁不平衡和复杂遗传模式。

孟德尔遗传是基因遗传学的基础,它描述了通过有性生殖传递等位基因的方式。

连锁不平衡是指不同基因座上的等位基因之间相互组合的非随机性现象。

复杂遗传模式体现了多基因和环境的相互作用对等位基因多态性的影响。

等位基因多态性对进化过程起着重要的作用。

通过自然选择,适应环境的等位基因可在群体中增加频率,而不适应环境的等位基因则会减少甚至消失。

这种选择作用促使物种适应环境的演化。

此外,等位基因多态性还可以提供有效的基因交换和遗传重组方法,促进了群体间或物种间的遗传融合,从而推动了进化进程的发生。

深入理解DNA等位基因多态性的遗传规律对于癌症、遗传疾病和物种适应性等方面具有重要意义。

在癌症研究中,等位基因多态性可以帮助识别易感基因和风险因子,为早期诊断和治疗提供依据。

对于遗传疾病的研究,等位基因多态性提供了理解基因突变对疾病发生和发展的机制。

自然界中生物多样性的遗传学机制

自然界中生物多样性的遗传学机制

自然界中生物多样性的遗传学机制自然界中有着无数种生物,每一种生物都有其独特的形态、行为和遗传特征。

生物的多样性让我们在学习生态学时深感其神奇和美妙。

生物的多样性是如何形成的呢?我们可以从遗传学的角度来探讨这个问题。

一、基因的多样性生物的多样性离不开基因的多样性。

人类的基因组中有大约2万5千个基因。

每个基因在编码不同的蛋白质时都会有一些突变,这些突变就是基因的多态性。

基因的多态性可以分为两种类型:单态性和多态性。

单态性是指一个基因只有一个等位基因,而多态性则是指一个基因有两个或以上的等位基因。

多态性基因相对单态性基因更有利于适应复杂的环境因素,因为它在基因型和表现型上能够呈现出更精细的差异。

而单态性基因则更容易在基因型和表现型上呈现出极端的结果。

二、自由组合在生殖细胞分裂过程中,每个染色体都会从母细胞分离并随机组合,产生新的基因组合。

这个过程叫做自由组合。

自由组合机制使得相同物种不同个体之间的基因组合变得可能,从而增加了物种的遗传多样性。

此外,自由组合机制还为基因突变和重组提供了基础。

三、基因重组除了自由组合以外,基因重组也是物种遗传多样性的重要机制。

基因重组是指染色体在减数分裂过程中断裂和重组的过程。

假如两个基因位点之间有无数个交叉点,那么在减数分裂过程中会生成无数个不同的基因组合 pattern。

因此,基因重组是物种遗传多样性得以实现的重要途径之一。

四、基因突变基因突变是指基因在不同时间和地点发生改变或变异的过程。

基因突变可以是一种随机或有目的的过程,是造成基因高度变异的主要机制之一。

基因突变发生的原因很多,可能与环境的辐射、化学毒素、自然选择等因素有关,而影响突变频率和形态的因素则主要来自自然选择和随机进化这两个方面。

基因突变为物种的遗传多样性提供了持久而重要的贡献。

五、自然选择自然选择是由于生物与环境之间的适应程度不同而导致的一种选择过程。

环境中有利的基因型表现得更为强劲,自然选择会因此选择出该基因型而逐渐消除不利的遗传特征。

函数多态和函数重载

函数多态和函数重载

函数多态和函数重载是面向对象程序设计中常见的两种概念,它们在不同情况下起着不同的作用。

函数多态是指同一个函数名称在不同情况下具有不同的表现形式或含义,而函数重载则是指在同一个类中可以定义多个同名函数,但它们的参数类型或个数不同。

虽然函数多态和函数重载都涉及同一个函数名称的多种实现方式,但它们的实现原理和作用机制却有着明显的区别。

首先,函数多态是面向对象编程中的一个重要概念,它能够让程序员在编写代码时更加灵活。

函数多态主要分为编译时多态和运行时多态两种类型。

编译时多态是指在编译阶段根据上下文的不同选择合适的函数实现,而运行时多态则是通过虚函数来实现,在运行时根据对象实际类型来调用相应的函数。

通过函数多态,程序员能够实现代码的重用和灵活性,提高程序的可维护性和扩展性。

另一方面,函数重载也是一种常见的编程技术,它能够让程序员用同一个函数名称来实现多种功能。

函数重载的实现依赖于函数的参数类型或个数,当编译器在编译阶段发现函数调用时,会根据函数的参数类型和个数选择合适的函数实现。

函数重载能够简化程序的编写,减少代码量,同时也能提高代码的可读性和易维护性。

虽然函数多态和函数重载都能实现同一个函数名称的多种实现方式,但它们的作用机制和实现原理有很大的不同。

函数多态是通过虚函数和继承来实现的,它能够实现子类对父类的函数进行重写,从而实现多态性。

而函数重载则是通过函数的参数类型和个数来实现的,编译器会根据函数调用的参数来选择合适的函数实现。

在实际编程中,程序员可以根据具体的需求来选择使用函数多态还是函数重载。

如果需要实现不同类型的对象对同一个函数进行不同的操作,可以选择使用函数多态。

而如果需要对同一个函数进行不同的操作,可以选择使用函数重载。

在实际项目中,函数多态和函数重载常常结合使用,以实现更加灵活和强大的功能。

梳理一下本文的重点,我们可以发现,函数多态和函数重载是面向对象程序设计中常见的两种概念,它们在不同情况下发挥着重要的作用。

遗传遗传多态性与个体适应性

遗传遗传多态性与个体适应性

遗传遗传多态性与个体适应性生命的多样性是我们的自然界的一大精髓。

在生态学研究中,我们常会涉及到生物种群的适应性。

深究生物的适应性,不难发现其中多样性是重要的原因之一。

而在生物适应性的多样性中,遗传多态性又是一个十分关键的元素。

遗传遗传多态性的含义遗传多态性是指种群或品种在遗传物质中的可变性。

在同一物种中,因为基因互相作用,同一基因可以有不同的表现形式(即等位基因)。

这些不同的表现形式如果比例相当,就称之为遗传多态性。

遗传多态性是一种基因组水平的多样性现象,与物种多样性的生态学意义有着重要的联系。

遗传多态性的形成机制遗传多态性是在一个遗传上可变的范畴中,遗传基因型的表现现象。

在自然环境中,这些可变性是由各种遗传机制所导致的,包括:基因突变、重组、选择、迁移、突变和再结合等。

这些基因变异机制包括基因重组、交叉、基因流,是自然选择的物质基础。

遗传多态性的生态学意义遗传多态性是生物种群在漫长的进化过程中的自然选择结果,其内在的多样性是生物的适应性所基础。

在一定条件下,适应性好的表现型能够更好地生存下来,从而促进了生物的进化。

遗传多态性在生态系统中发挥着重要的生态学作用,支撑了生物多样性的维持和进化。

个体适应性与遗传多态性个体适应性是指个体对各种环境要素的适应程度,承受压力和克服障碍的能力。

个体适应性与遗传多态性的关系既密不可分,又有所不同。

在一些生态系统中,由于环境选择的限制,遗传多态性的比例可能会减少,而适应性也会相应降低。

在这样的环境中,物种的适应能力会受到限制,也会进一步影响个体的适应能力。

然而,同样的物种在不同环境下,因为条件的差异往往会引发遗传多态性的表现。

在这样的情况下,个体适应性的提高更多依靠于遗传多态性的表现和变化。

这时候,为了更好的適应环境,个体间的遗传差异会更加明显,进而提升个体适应性。

遗传多态性与人类健康在生态学研究中,遗传多态性也定期涉及到人类社会发展和健康问题。

许多疾病,如乳腺癌、高血压、先天性心脏病等,都与遗传多态性有关。

蛋白质多态性与种间适应机制研究

蛋白质多态性与种间适应机制研究

蛋白质多态性与种间适应机制研究随着生物学领域的不断发展,人们对于蛋白质多态性和种间适应机制的研究越来越深入。

蛋白质是生命体中最重要的基本物质之一,决定着生命体的结构和功能。

而蛋白质的多态性则是指同一种蛋白质在不同个体中表现出来的差异性。

而种间适应机制则是指不同物种在演化过程中对于外部环境的适应和变化机制。

本文将从两个方面分别探讨蛋白质多态性和种间适应机制的研究进展。

一、蛋白质多态性的研究蛋白质多态性是生命科学领域中的一个基本概念。

同一个基因编码的蛋白质在不同个体中可能会出现不同的表现,这就是蛋白质多态性现象。

蛋白质多态性不仅可以影响到生物的性状和表型,还与生物体对环境的适应和抗逆能力密切相关。

因此,对蛋白质多态性的研究一直是生物学领域中的热点之一。

对于蛋白质多态性的研究,常用的手段包括高分辨率电泳、质谱分析等方法。

这些方法可以对蛋白质的分子结构和功能进行深入的分析,探究蛋白质分子之间的差异和相似性。

同时,研究人员还通过对基因序列的分析,深入挖掘蛋白质多态性现象的机制。

近年来,生物学领域中出现了一种新的研究方法——蛋白质组学。

通过蛋白质组学技术,研究人员可以对细胞中所有蛋白质进行系统化分析和比较。

这种方法不仅能够在分子水平上更加深入地研究蛋白质多态性,还能够为生物类群之间的进化和适应提供更加完整的信息。

二、种间适应机制的研究种间适应机制是指物种在长期演化过程中,对于外部环境的适应和响应机制。

种间适应机制不仅涉及到物种的基因变异和表现差异,还与生物体对于环境变化的感知和反应方式密切相关。

对于种间适应机制的研究,不仅能够深入探究生命进化的规律和机制,还能够为环境保护和生态平衡的重构提供理论指导。

在种间适应机制的研究中,常采用的方法包括基因组学、表观遗传学等技术手段。

通过基因组学技术,研究人员可以深入了解生物体基因序列的组成和特征,挖掘基因变异背后的演化途径和分子机制。

而表观遗传学的研究则聚焦于生物体在特定时间和状态下基因表达的差异性,从分子层面探究生命体对于环境变化的感知和响应方式。

2021年软件设计师考试题目

2021年软件设计师考试题目

1、在软件开发生命周期中,哪个阶段主要负责确定软件系统的功能和性能要求?A. 需求分析B. 系统设计C. 编码实现D. 测试与维护(答案:A)2、下列关于软件体系结构的描述中,哪一项是不正确的?A. 软件体系结构是软件设计的高层次表示B. 它描述了软件组件之间的交互和依赖关系C. 软件体系结构不关心组件的内部实现细节D. 软件体系结构在编码阶段才开始考虑(答案:D)3、在面向对象编程中,多态性主要通过什么机制实现?A. 封装B. 继承C. 方法重载和方法重写D. 抽象类(答案:C)4、关于软件测试,以下哪个说法是错误的?A. 单元测试是对单个模块进行测试B. 集成测试是在单元测试之后,将模块组合起来进行测试C. 系统测试是对整个软件系统进行测试,包括功能和非功能测试D. 验收测试是由开发人员自行进行的最终测试(答案:D)5、在数据库设计中,ER图(实体-关系图)主要用于表示什么?A. 数据流图B. 数据结构C. 概念数据模型D. 物理数据模型(答案:C)6、下列哪种算法常用于解决图中的最短路径问题?A. 深度优先搜索(DFS)B. 广度优先搜索(BFS)C. Dijkstra算法D. A算法(虽然A也用于路径搜索,但此处更常指的是Dijkstra用于无负权图)(答案:C)7、在软件项目管理中,为了评估项目风险并制定相应的应对措施,通常会进行哪个过程?A. 风险识别与分析B. 需求变更管理C. 进度计划制定D. 质量保证计划(答案:A)8、关于敏捷开发方法,以下哪个陈述是不准确的?A. 敏捷开发强调以人为本、协作和快速响应变化B. 敏捷团队通常不编写详细的前期文档,而是注重工作软件和面对面的沟通C. 敏捷开发适用于所有类型的软件项目,无论其规模和复杂度如何D. Scrum和Kanban是敏捷开发中的两种流行框架(答案:C)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++的多态性实现机制剖析――即VC++视频第三课this指针详细说明作者:孙鑫时间:2006年1月12日星期四1.多态性和虚函数我们先看一个例子:例1- 1#include <iostream.h>class animal{public:void sleep(){cout<<"animal sleep"<<endl;}void breathe(){cout<<"animal breathe"<<endl;}};class fish:public animal{public:void breathe(){cout<<"fish bubble"<<endl;}};void main(){fish fh;animal *pAn=&fh;pAn->breathe();}注意,在例1-1的程序中没有定义虚函数。

考虑一下例1-1的程序执行的结果是什么?答案是输出:animal breathe我们在main()函数中首先定义了一个fish类的对象fh,接着定义了一个指向animal类的指针变量pAn,将fh的地址赋给了指针变量pAn,然后利用该变量调用pAn->breathe()。

许多学员往往将这种情况和C++的多态性搞混淆,认为fh实际上是fish类的对象,应该是调用fish类的breathe(),输出“fish bubble”,然后结果却不是这样。

下面我们从两个方面来讲述原因。

1、 编译的角度C++编译器在编译的时候,要确定每个对象调用的函数的地址,这称为早期绑定(early binding ),当我们将fish 类的对象fh 的地址赋给pAn 时,C++编译器进行了类型转换,此时C++编译器认为变量pAn 保存的就是animal 对象的地址。

当在main()函数中执行pAn->breathe()时,调用的当然就是animal 对象的breathe 函数。

2、 内存模型的角度我们给出了fish 对象内存模型,如下图所示:图1- 1 fish 类对象的内存模型我们构造fish 类的对象时,首先要调用animal 类的构造函数去构造animal 类的对象,然后才调用fish 类的构造函数完成自身部分的构造,从而拼接出一个完整的fish 对象。

当我们将fish 类的对象转换为animal 类型时,该对象就被认为是原对象整个内存模型的上半部分,也就是图1-1中的“animal 的对象所占内存”。

那么当我们利用类型转换后的对象指针去调用它的方法时,当然也就是调用它所在的内存中的方法。

因此,输出animal breathe ,也就顺理成章了。

正如很多学员所想,在例1-1的程序中,我们知道pAn 实际指向的是fish 类的对象,我们希望输出的结果是鱼的呼吸方法,即调用fish 类的breathe 方法。

这个时候,就该轮到虚函数登场了。

前面输出的结果是因为编译器在编译的时候,就已经确定了对象调用的函数的地址,要解决这个问题就要使用迟绑定(late binding )技术。

当编译器使用迟绑定时,就会在运行时再去确定对象的类型以及正确的调用函数。

而要让编译器采用迟绑定,就要在基类中声明函数时使用virtual 关键字(注意,这是必须的,很多学员就是因为没有使用虚函数而写出很多错误的例子),这样的函数我们称为虚函数。

一旦某个函数在基类中声明为virtual ,那么在所有的派生类中该函数都是virtual ,而不需要再显式地声明为virtual 。

下面修改例1-1的代码,将animal 类中的breathe()函数声明为virtual ,如下:例1- 2#include <iostream.h>fish 类的对象所占内存class animal{public:void sleep(){cout<<"animal sleep"<<endl;}virtual void breathe(){cout<<"animal breathe"<<endl;}};class fish:public animal{public:void breathe(){cout<<"fish bubble"<<endl;}};void main(){fish fh;animal *pAn=&fh;pAn->breathe(); }大家可以再次运行这个程序,你会发现结果是“fish bubble ”,也就是根据对象的类型调用了正确的函数。

那么当我们将breathe()声明为virtual 时,在背后发生了什么呢?编译器在编译的时候,发现animal 类中有虚函数,此时编译器会为每个包含虚函数的类创建一个虚表(即vtable ),该表是一个一维数组,在这个数组中存放每个虚函数的地址。

对于例1-2的程序,animal 和fish 类都包含了一个虚函数breathe(),因此编译器会为这两个类都建立一个虚表,如下图所示:图1- 2 animal 类和fish 类的虚表 那么如何定位虚表呢?编译器另外还为每个类的对象提供了一个虚表指针(即vptr ),这个指针指向了对象所属类的虚表。

在程序运行时,根据对象的类型去初始化vptr ,从而让vptr 正确的指向所属类的虚表,从而在调用虚函数时,就能够找到正确的函数。

对于例1-2的程序,由于pAn 实际指向的对象类型是fish ,因此vptr 指向的fish 类的vtable ,当调用animal 类的fish 类的vtablepAn->breathe()时,根据虚表中的函数地址找到的就是fish类的breathe()函数。

正是由于每个对象调用的虚函数都是通过虚表指针来索引的,也就决定了虚表指针的正确初始化是非常重要的。

换句话说,在虚表指针没有正确初始化之前,我们不能够去调用虚函数。

那么虚表指针在什么时候,或者说在什么地方初始化呢?答案是在构造函数中进行虚表的创建和虚表指针的初始化。

还记得构造函数的调用顺序吗,在构造子类对象时,要先调用父类的构造函数,此时编译器只“看到了”父类,并不知道后面是否后还有继承者,它初始化父类对象的虚表指针,该虚表指针指向父类的虚表。

当执行子类的构造函数时,子类对象的虚表指针被初始化,指向自身的虚表。

对于例2-2的程序来说,当fish类的fh对象构造完毕后,其内部的虚表指针也就被初始化为指向fish类的虚表。

在类型转换后,调用pAn->breathe(),由于pAn实际指向的是fish类的对象,该对象内部的虚表指针指向的是fish类的虚表,因此最终调用的是fish类的breathe()函数。

要注意:对于虚函数调用来说,每一个对象内部都有一个虚表指针,该虚表指针被初始化为本类的虚表。

所以在程序中,不管你的对象类型如何转换,但该对象内部的虚表指针是固定的,所以呢,才能实现动态的对象函数调用,这就是C++多态性实现的原理。

总结(基类有虚函数):1、每一个类都有虚表。

2、虚表可以继承,如果子类没有重写虚函数,那么子类虚表中仍然会有该函数的地址,只不过这个地址指向的是基类的虚函数实现。

如果基类3个虚函数,那么基类的虚表中就有三项(虚函数地址),派生类也会有虚表,至少有三项,如果重写了相应的虚函数,那么虚表中的地址就会改变,指向自身的虚函数实现。

如果派生类有自己的虚函数,那么虚表中就会添加该项。

3、派生类的虚表中虚函数地址的排列顺序和基类的虚表中虚函数地址排列顺序相同。

2.VC视频第三课this指针说明我在论坛的VC教学视频版面发了帖子,是模拟MFC类库的例子写的,主要是说明在基类的构造函数中保存的this指针是指向子类的,我们在看一下这个例子:例1- 3#include <iostream.h>class base;base * pbase;class base{public:base(){pbase=this;}virtual void fn(){cout<<"base"<<endl;}};class derived:public base{void fn(){cout<<"derived"<<endl;}};derived aa;void main(){pbase->fn();}我在base类的构造函数中将this指针保存到pbase全局变量中。

在定义全局对象aa,即调用derived aa;时,要调用基类的构造函数,先构造基类的部分,然后是子类的部分,由这两部分拼接出完整的对象aa。

这个this指针指向的当然也就是aa对象,那么我们在main()函数中利用pbase调用fn(),因为pbase实际指向的是aa对象,而aa对象内部的虚表指针指向的是自身的虚表,最终调用的当然是derived类中的fn()函数。

在这个例子中,由于我的疏忽,在derived类中声明fn()函数时,忘了加public关键字,导致声明为了private(默认为private),但通过前面我们所讲述的虚函数调用机制,我们也就明白了这个地方并不影响它输出正确的结果。

不知道这算不算C++的一个Bug,因为虚函数的调用是在运行时确定调用哪一个函数,所以编译器在编译时,并不知道pbase指向的是aa对象,所以导致这个奇怪现象的发生。

如果你直接用aa对象去调用,由于对象类型是确定的(注意aa是对象变量,不是指针变量),编译器往往会采用早期绑定,在编译时确定调用的函数,于是就会发现fn()是私有的,不能直接调用。

:)许多学员在写这个例子时,直接在基类的构造函数中调用虚函数,前面已经说了,在调用基类的构造函数时,编译器只“看到了”父类,并不知道后面是否后还有继承者,它只是初始化父类对象的虚表指针,让该虚表指针指向父类的虚表,所以你看到结果当然不正确。

只有在子类的构造函数调用完毕后,整个虚表才构建完毕,此时才能真正应用C++的多态性。

换句话说,我们不要在构造函数中去调用虚函数,当然如果你只是想调用本类的函数,也无所谓。

3.参考资料:1、文章《在VC6.0中虚函数的实现方法》,作者:backer ,网址:/bbs/dispbbs.asp?boardid=4&id=1012&star=12、书《C++编程思想》机械工业出版社4.后记本想再写详细些,发现时间不够,总是有很多事情,在加上水平也有限,想想还是以后再说吧。

相关文档
最新文档