首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

函数、纯函数

浏览量 1 1.类里如果声明了函数,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖(override),这样的话,编译器就可以使用后期绑定来达到多态了。...纯函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。 2.函数在子类里面可以不重写;但纯函数必须在子类实现才可以实例化子类。...3.函数的类用于 “实作继承”,继承接口的同时也继承了父类的实现。纯函数关注的是接口的统一性,实现由子类完成。...4.带纯函数的类叫抽象类,这种类不能直接生成对象,而只有被继承,并重写其函数后,才能使用。抽象类被继承后,子类可以继续是抽象类,也可以是普通类。 5.基类是继承的基类,具体见下文继承。

40720

【C++】函数指针函数列表

本篇文章主要来讲述,C++多态的实现原理,也就是函数函数列表是怎么回事?它们是如何实现多态的?...3.对于派生类而言,如果派生类实现了基类函数,在派生类的函数列表,对应的函数会被替换成派生类的这个函数地址。...基类的函数列表继承类的函数列表是两个,是不相同的,继承类的函数列表存储的是继承类的函数实现,如果继承类没有实现基类的函数的话,会存储基类的函数地址。例子参见继承类的执行结果。...执行结果分析: 通过上面执行结果,我们可以看出多继承的情况下,继承类对象函数指针个数是基类的数量。同样,如果继承类实现了基类函数的话,会被替换成继承类实现的函数。...C++多态的副作用 C++采用函数函数列表的方式来实现多态,确实给我们带来了很大的好处,让我们可以在不改变代码的时候,就能直接替换成运行的继承类的函数

1.3K31
您找到你想要的搜索结果了吗?
是的
没有找到

C++不要在构造函数析构函数调用函数

虽然可以对函数进行实调用,但程序员编写函数的本意应该是实现动态联编。在构造函数调用函数函数的入口地址是在编译时静态确定的,并未实现调用。...但是为什么在构造函数调用函数,实际上没有发生动态联编呢? 1. 不要在构造函数调用函数的原因 第一个原因,在概念上,构造函数的工作是为对象进行初始化。...在Visual C++,包含函数的类对象的指针被安排在对象的起始地址处,并且函数表(vtable)的地址是由构造函数写入指针的。...2.不要在析构函数调用函数的原因 同样的,在析构函数调用函数函数的入口地址也是在编译时静态决定的。也就是说,实现的是实调用而非虚调用。 考察如下例子。...因此,一般情况下,应该避免在构造函数析构函数调用函数,如果一定要这样做,程序猿必须清楚,这是对函数的调用其实是实调用。

2.7K30

一口气搞懂《函数函数

由于我们假设所有的飞行器都有两种行为:加油飞行。因此我们可以将这两种行为抽象到一个基类,并由它来派生具体的某款飞行器。...函数函数都能做到这一点,区别是,子类如果不提供函数的实现,那就会自动调用基类的缺省方案。而子类如果不提供纯函数的实现,则编译将会失败。...第四,基类提供的纯函数的实现版本,并非为了多态性考虑,因为指向子类对象的基类指针引用无法调用该版本。...纯函数在基类的实现跟多态性无关,它只是提供了一种语法上的便利,在变化多端的应用场景留有后路。...第五,函数普通的函数实际上是存储在不同的区域的,函数所在的区域是可被覆盖(也称复写override)的,每当子类定义相同名称的函数时就将原来基类的版本给覆盖了,另一侧面也说明了为什么基类声明的函数在后代类不需要另加声明一律自动为函数

70520

函数

,   可以在基类的派生类函数重新定义(形式也是:virtual 函数返回值类型 函数名(形参表){ 函数体 }),在派生类重新定义的函数应与函数具有相同的形参个数形参类型。...定义函数的限制:   (1)非类的成员函数不能定义为函数,类的成员函数静态成员函数构造函数也不能定义为函数,但可以将析构函数定义为函数。...(3)如果声明了某个成员函数函数,则在该类不能出现这个成员函数同名并且返回值、参数个数、参数类型都相同的非虚函数。...不利于学习阅读,所以这是我想写下这篇文章的原因。也希望大家多给我提意见 言归正传,让我们一起进入函数的世界。   ...下面,我将分别说明“无覆盖”“有覆盖”时的子类函数表的样子。没有覆盖父类的函数是毫无意义的。我之所以要讲述没有覆盖的情况,主要目的是为了给一个对比。

70330

函数与纯函数的区别

; 纯函数(pure virtual)   C++包含纯函数的类,被称为是“抽象类”。...抽象类不能使用new出对象,只有实现了这个纯函数的子类才能new出对象。   C++的纯函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。   ...C++的纯函数也是一种“运行时多态”。   ...} //函数 virtual void xhs(){ //这个函数必须得在基类实现 cout<<"我是基类的函数"<<endl;//即使是空的函数也要在基类实现...} //派生类可以不写这个函数,但是派生类对象调用时会调用积累的函数 //纯函数 virtual void cxhs() =0; //这个纯函数不在基类实现,必须在子类实现

1.2K10

多态析构函数

为什么析构函数要声明成virtual呢? 因为,如果delete一个基类的指针时, 如果它指向的是一个子类的对象,那么析构函数不为就会导致无法调用子类析构函数,从而导致资源泄露。...return 0; } delete pa 实际上相当于: pa->~Animal(); 释放pa所指向的内存 在这里,因为~Animal()是virtual的,尽管是通过Animal类型的指针调用的,根据表...去掉析构函数的virtual属性后,因为该类没有其他的virtual函数,所以编译时不会生成v-table,这样就节省了编译时间,并减少了最终生成的程序的大小。...同样,当作一个抽象时,如果你模仿Java的interface,声明了如下的基类: class AbstractBase { virtual method1() = 0; virtual...并没有这个virutal构造函数

73960

函数继承寻踪

一、基本对象模型 首先,我们定义一个简单的类,它含有一个数据成员一个函数。...比如上边的例子MyClassC的对象内包含MyClassAMyClassB子对象,但是MyClassAMyClassB内含有共同的基类MyClass。...函数表不同的是,基类表的第一项记录着当前子对象相对与基类表指针的偏移。MyClassAMyClassB子对象内的表指针都是存储在相对于自身的4字节偏移处,因此该值是-4。...假定MyClassAMyClassC或者MyClassB内没有定义新的函数,即不会产生函数表,那么基类表第一项字段的值应该是0。...至于基类定义的函数,它其他的函数的访问形式相同,本例,如果使用基类指针MyClass*pc访问MyClassC对象的fun,将会被转化为如下形式: *(pc+28)[0]() 通过以上的描述

83790

C++ 在继承函数、纯函数、普通函数,三者的区别

如下就是一个父类函数: class A { public: virtual void out2(string s) { cout<<"A(out2):"<<s<<endl...; } }; 2.纯函数(pure virtual)        C++包含纯函数的类,被称为是“抽象类”。...抽象类不能使用new出对象,只有实现了这个纯函数的子类才能new出对象。   C++的纯函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。   ...C++的纯函数也是一种“运行时多态”。   ...普通函数是父类为子类提供的“强制实现”。   因此,在继承关系,子类不应该重写父类的普通函数,因为函数的调用至于类对象的字面值有关。

1.2K30

函数&多态

对于经常被问到的函数多态的问题,发现百度百科回答得十分详细,所以自己在百度百科上的解释进行总结 一、函数 (1)函数简介:在某基类声明为virtual并在一个或者多个派生类中被重新定义的成员函数...作为基类的Animal的成员函数speak( )被定义为函数,相应的其派生类Dog的成员函数speak( )自动变为函数;所以对于派生类相应成员函数是否加上virtual关键字修饰,是可选的,但是为了可读性...(5)限制条件: 非类的成员函数不能定义为函数,类的成员函数静态函数、构造函数也不能定义为函数,但是析构函数可以被定义为函数; 当基类的某一成员函数声明为函数后,派生类的同名函数函数名相同...、参数列表完全一致、返回类型相关)自动成为函数; 如果声明了某个成员函数函数,则在该类不能出现这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数;在以该类为基类的派生类,也不能出现这种同名函数...java当子类拥有父类同样的函数,当通过这个父类对象的引用调用这个函数的时候,调用到的是子类函数。 三、重构   一种糟糕的现象:软件产品最初制造出来,是经过精心的设计,具有良好架构的。

1K10

C++学习——函数与纯函数

文章目录 引言: 一、函数的定义使用 关于函数,说明以下几点: 函数的访问 二、纯函数 三、补充内容 指向类数据成员的指针变量 例题: 引言: 若要访问派生类相同名字的函数,必须将基类的同名函数定义为...一、函数的定义使用 可以在程序运行时通过调用相同的函数名而实现不同功能的 函数称为函数。...关于函数,说明以下几点: 1、当在基类把成员函数定义为函数后,在其派生类定义的函数必须与基类函数同名,参数的类型、顺序、参数的个数必须一一对应,函数的返回的类型也相同。...3、函数必须是类的一个成员函数,不能是友元函数,也不能是静态 的成员函数。 4、在派生类没有重新定义函数时,与一般的成员函数一样,当调 用这种派生类对象的函数时,则调用其基类函数。...6、当用这种指针指向静态的成员函数时,可直接使用类名而不要列举对象名。这 是由静态成员函数的特性所确定的。 例题: 通过函数实现一个计算矩形面积三角形状面积的程序。

61220

C++的函数与纯函数

C++的函数是一种特殊的成员函数,用于实现多态性。函数允许在基类声明一个函数,在派生类根据需要进行重写,并通过基类指针或引用来调用派生类对象的特定实现。...①函数的声明 在基类,我们可以使用关键字virtual来声明一个函数。...ptr->show(); ③派生类重写函数 派生类可以重写基类函数,以提供自己的实现。...重写的函数必须具有相同的名称、返回类型参数列表。...函数使用动态绑定,即运行时将根据对象的实际类型选择正确的函数实现。 构造函数不能是函数。 静态成员函数不能是函数函数可以被继承,派生类可以选择是否重写函数

15710

构造函数析构函数可以是函数吗,在里面能调用函数

复盘 构造函数作为函数?...先说构造函数,构造函数作为函数是不可以的,首先c++编译器上不会让你通过 在内存上,我们知道,一个对象会有一个函数表,函数表在构造函数初始化,可是一个对象还没有完成实例化,他的函数表是不存在的...构造函数是不行的,但是析构函数作为函数确实常用的,特别是基类的析构函数一定要声明为函数。首先既然对象存在,那么函数表肯定存在,所以析构函数作为函数是合理的。...//Father f 代码运行后,构造函数只调用了父类的函数,我们本来想要调用子类的函数。...那么如果我们在子类重新定义构造函数,那么程序如我们所愿 #include using namespace std; class Father { public: Father

1.1K50

函数详解

二、函数实例 在上述例子,我们首先定义了一个基类base,基类有一个名为vir_func的函数一个名为func的普通成员函数。...最后,我们将指针b做强制类型转换,转换为A类型指针,然后分别调用funcvir_func函数,发现普通函数调用的是类A的函数,而函数调用的是类B的函数。...三、函数的实现(内存布局) 函数只存有一个函数的指针地址,不存放普通函数或是构造函数的指针地址。...那么,在派生类的实例,其函数表如下所示: 【Note】: 函数按照其声明顺序放于表。 父类的函数在子类的函数前面。...对于子类实例函数表,是下面这个样子: 【Note】: 每个父类都有自己的表(有几个基类就有几个函数表)。 子类的成员函数被放到了第一个父类的表

81340

函数

定义 纯函数就是在基类声明的函数,它在基类没有定义,但要求任何派生类都要定义自己的实现方法。...在基类实现纯函数的方法是在函数原型后面加“=0” 引入原因 方便的使用多态,因此常常在基类定义函数 在很多情况下,基类本身生成对象是不合理的。...所以,纯函数的声明就是在告诉子类的设计者,“你必须提供一个纯函数的实现,但我不知道你会怎样实现它” 抽象类的介绍 抽象类是一种特殊的类,它是为了抽象设计的目的而建立的,它处于继承层次结构的较上层...纯函数函数有什么区别 纯函数声明如下:virtual void function1()=0; 纯函数一定没有定义,纯函数用来规范派生类的行为, 即接口。...函数的声明如下:virtual void function(parameter); 函数必须实现,如果不实现,编译器将报错。 对于函数来说,父类子类都有各自的版本。

1K20

干货丨C++函数

在这篇文章,我只想从函数的实现机制上面为大家一个清晰的剖析。...这样,在有函数的类的实例这个表被分配在了 这个实例的内存,所以,当我们用父类的指针来操作一个子类的时候,这张函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。...下面,我将分别说明“无覆盖”“有覆盖”时的函数表的样子。没有覆盖父类的函数是毫无意义的。我之所以要讲述没有覆盖的情况,主要目的是为了给一个对比。...多重继承(无函数覆盖) 下面,再让我们来看看多重继承的情况,假设有下面这样一个类的继承关系。注意:子类并没有覆盖父类的函数。 ? 对于子类实例函数表,是下面这个样子: ?...下图中,我们在子类覆盖了父类的f()函数。 ? 下面是对于子类实例函数表的图: ? 我们可以看见,三个父类函数的f()的位置被替换成了子类的函数指针。

52241
领券