多态性实现机制

合集下载

虚函数的多态性机制分析

虚函数的多态性机制分析
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. 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.后记本想再写详细些,发现时间不够,总是有很多事情,在加上水平也有限,想想还是以后再说吧。

相关文档
最新文档