首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏个人编程笔记

    函数、纯函数

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

    66320编辑于 2023-03-03
  • 来自专栏xingoo, 一个梦想做发明家的程序员

    函数

    函数 代码如下定义: // test1107.cpp : 定义控制台应用程序的入口点。 son s; cout<<f.get_age()<<endl; cout<<s.get_age()<<endl; system("pause"); } 输出为: 1 0 在基类中的函数 当基类中的函数定义时,是使用指针或者引用作为参数,那么在运行是,要判断传入的参数,是基类的对象,还是派生类的对象。 如果是基类的对象,则调用基类中的函数定义。 如果是派生类的对象,则调用派生类中对基类函数的新定义的函数

    69150发布于 2018-01-17
  • 来自专栏分享学习

    函数与纯函数的区别

    函数(impure virtual)   C++的函数主要作用是“运行时多态”,父类中提供函数的实现,为子类提供默认的函数实现。   子类可以重写父类的函数实现子类的特殊化。    ; 纯函数(pure virtual)   C++中包含纯函数的类,被称为是“抽象类”。 C++中的纯函数也是一种“运行时多态”。    } //函数 virtual void xhs(){ //这个函数必须得在基类中实现 cout<<"我是基类的函数"<<endl;//即使是空的函数也要在基类中实现 } //派生类中可以不写这个函数,但是派生类对象调用时会调用积累的函数 //纯函数 virtual void cxhs() =0; //这个纯函数不在基类中实现,必须在子类中实现

    1.6K10发布于 2020-03-23
  • 来自专栏全栈程序员必看

    函数

    实现动态联编需要三个条件:   1、 必须把需要动态联编的行为定义为类的公共属性的函数。   2、 类之间存在子类型关系,一般表现为一个类从另一个类公有派生而来。    而不将析构函数定义为函数时,只调用基类的析构函数。   (2)只需要在声明函数的类体中使用关键字“virtual”将函数声明为函数,而定义函数时不需要使用关键字“virtual”。    我们可以看到下面几点:   1)函数按照其声明顺序放于表中。   2)父类的函数在子类的函数前面。   一般继承(有函数覆盖)   覆盖父类的函数是很显然的事情,不然,函数就变得毫无意义。 那么,对于派生类的实例的函数表会是下面的样子:   我们从表中可以看到下面几点,   1)覆盖的f()函数被放到了子类函数表中原来父类函数的位置。   2)没有被覆盖的函数依旧。    对于子类实例中的函数表,是下面这个样子:   我们可以看到:   1) 每个父类都有自己的表。   2) 子类的成员函数被放到了第一个父类的表中。

    1.4K31编辑于 2022-09-06
  • 来自专栏Linux网络:从不懂到不会

    C++笔记-多态(包含函数,纯函数函数表等)

    2.多态的定义及实现 2.1多态的构成条件 多态是一个继承关系下的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。 2.1.1实现多态还有两个必须重要条件 1.必须是基类的指针或者引用调用函数 2.被调用的函数必须是函数,并且完成了函数重写 说明:要实现多态效果,第一必须是基类的指针或引用,因为只有基类的指针或引用才能既指向基类对象又指向派生类对象 2.析构函数的重写 基类的析构函数函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同看起来不符合重写的规则,实际上编译器对析构函数的名称做了特殊处理 2.派生类由两部分构成,继承下来的基类和自己的成员,一般情况下,继承下来的基类中有函数表指针,自己就不会再生成函数表指针。 4.派生类的函数表中包含,(1)基类的函数地址,(2)派生类重写的函数地址完成覆盖,派生类自己的函数地址三个部分。

    21710编辑于 2026-01-12
  • 来自专栏技术点滴

    函数继承寻踪

    前四个字节存储的是函数表的指针vfptr,后四个字节存储对象成员var的值。函数表的大小为4字节,就一条函数地址,即函数fun的地址,它在函数表vftable的偏移是0。 并且函数表内的记录多了一条——MyClassA自己定义的函数funA。它的对象模型如图2所示。 ? 图2 MyClassA对象模型 我们可以得出结论:在单继承形式下,子类的完全获得父类的函数表和数据。 : 1>      | &MyClassC_meta 1>      |  0 1>   0    | &MyClassA::fun 1>   1    | &MyClassA::funA 1>   2     而且每一个父类都对应一个单独的函数表。MyClassC的对象模型如图3所示。 ? 图3 MyClassC对象模型 多重继承下,子类不再具有自身的函数表,它的函数表与第一个父类的函数表合并了。

    1.1K90发布于 2018-02-05
  • 来自专栏全栈程序员必看

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

    2、实现这种动态的多态性时,必须使用基类类型的指针变量,并使该 指针指向不同的派生类对象,并通过调用指针所指向的函数才能实现 动态的多态性。 函数的访问 用基类指针访问与用对象名访问的区别: 1、用基指针访问函数时,指向其实际派生类对象重新定义的函数。实 现动态聚束。 2、通过一个对象名访问时,只能静态聚束。 2、把函数名赋值为0,本质上是将指向函数体的指针值赋为初值0。与定义空函数不一样,空函数函数体为空,即调用该函数时,不执行任何动作。没有在派生类重新定义这种函数之前,是不能调用这种纯函数的。 *mptr2)(100); 或: (ps->*mptr1)( ); (ps-*mptr2)(100); 对指向成员函数的指针变量的使用方法说明以下几点: 1、指向类中成员函数的指针变量不是类中的成员, 2、不能将任一成员函数的地址赋给指向成员函数的指针变量,只有成员函数的参 数个数、参数类型、参数的顺序和函数的类型均与这种指针变量相同时,才能将成 员函数的指针赋给这种变量。

    5.9K20编辑于 2022-09-23
  • 来自专栏叶子的开发者社区

    C++的函数与纯函数

    C++的函数是一种特殊的成员函数,用于实现多态性。函数允许在基类中声明一个函数,在派生类中根据需要进行重写,并通过基类指针或引用来调用派生类对象的特定实现。 ①函数的声明 在基类中,我们可以使用关键字virtual来声明一个函数。 ptr->show(); ③派生类重写函数 派生类可以重写基类中的函数,以提供自己的实现。 ." << endl; } }; ④纯函数 函数也可以被声明为纯函数,即没有默认实现的函数。纯函数通过在声明中使用= 0来标识。 函数使用动态绑定,即运行时将根据对象的实际类型选择正确的函数实现。 构造函数不能是函数。 静态成员函数不能是函数函数可以被继承,派生类可以选择是否重写函数

    68310编辑于 2023-07-30
  • 来自专栏女程序员的日常

    函数&多态

    对于经常被问到的函数和多态的问题,发现百度百科回答得十分详细,所以自己在百度百科上的解释进行总结 一、函数 (1)函数简介:在某基类中声明为virtual并在一个或者多个派生类中被重新定义的成员函数 (2)简单解释:被virtual关键字修饰的成员函数,就是函数。 (3)作用:实现多态性(polymorphism)。 (5)限制条件: 非类的成员函数不能定义为函数,类的成员函数中静态函数、构造函数也不能定义为函数,但是析构函数可以被定义为函数; 当基类中的某一成员函数声明为函数后,派生类中的同名函数函数名相同 、参数列表完全一致、返回类型相关)自动成为函数; 如果声明了某个成员函数函数,则在该类中不能出现和这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数;在以该类为基类的派生类中,也不能出现这种同名函数 (2)实现方法:C++中,实现多态可以通过函数、抽象类、覆盖、模板(重构与多态无关)。

    1.4K10发布于 2017-12-25
  • 来自专栏全栈程序员必看

    函数详解

    文章目录 一、多态与重载 1、多态的概念 2、重载—编译期多态的体现 3、函数—运行期多态的体现 二、函数实例 三、函数的实现(内存布局) 1、无继承情况 2、单继承情况(无函数覆盖) 3、单继承情况 (有函数覆盖) 4、多重继承情况(无函数覆盖) 5、多重继承情况(有函数覆盖) 四、函数的相关问题 1、构造函数为什么不能定义为函数 2、析构函数为什么要定义为函数? return 0; } 2、单继承情况(无函数覆盖) 假设有如下所示的一个继承关系: 请注意,在这个继承关系中,子类没有重载任何父类的函数。 ::f() b3->f(); //Derive::f() b1->g(); //Base1::g() b2->g(); //Base2::g() b3->g(); //Base3::g() 四、函数的相关问题 那么在构造函数完成之前,vptr是没有值的,也就无法通过vptr找到作为函数的构造函数所在的代码区。 2、析构函数为什么要定义为函数? 析构函数可以是函数且推荐最好设置为函数

    2.4K40编辑于 2022-09-17
  • 来自专栏我是业余自学C/C++的

    函数

    定义 纯函数就是在基类中声明的函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。 纯函数的意义在于,让所有的类对象(主要是派生类对象)都可以执行纯函数的动作,但类无法为纯函数提供一个合理的缺省实现。 纯函数函数有什么区别 纯函数声明如下:virtual void function1()=0; 纯函数一定没有定义,纯函数用来规范派生类的行为, 即接口。 实现了纯函数的子类,该纯函数在子类中就变成了了函数,子类的子类可以覆盖该函数,由多态方式调用的时候动态绑定。 函数是C++中用于实现多态的机制。核心理念就是通过基类访问派生类定义的函数。 在有动态分配堆上内存的时候,析构函数必须是函数,但没有必要是纯的。 友元不是成员函数,只有成员函数才可以使虚拟的,因此友元不能是虚拟函数

    1.4K20发布于 2018-05-28
  • 来自专栏灰子学技术

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

    说明: 1.函数列表中的最后一个.表示的是函数列表的结束符,类似于字符串的/0。 2.函数指针往往是在类对象的第一个元素。 Base b1; cout << "b1:函数表的地址:" << (int*)(&b1) << endl; for(int i = 0; i < 2; i++){ :函数表的地址:0x7fffd27d5e80 // 2. 指针是跟对象绑定的,每一个类对象会对应一个指针,这个原因应该是指针是作为类的一个数据存储的导致的。例子参考 Base b和b1两个对象的指针地址,明显是不相同的。 2. 这里可以看出是2函数指针,对应于基类数量d:函数表的地址:0x7fff5934cc80d:函数表的第[0][0]个函数地址:0x400e90 // 2.第一个基类的函数表首地址Derive f

    1.8K31发布于 2020-04-02
  • 来自专栏全栈程序员必看

    函数实现原理

    言归正传,让我们一起进入函数的世界。 函数表 对C++ 了解的人都应该知道函数(Virtual Function)是通过一张函数表(Virtual Table)来实现的。简称为V-Table。 那么,在派生类的实例中,其函数表如下所示: 对于实例:Derive d; 的函数表如下: 我们可以看到下面几点: 1)函数按照其声明顺序放于表中。 2)父类的函数在子类的函数前面。 一般继承(有函数覆盖) 覆盖父类的函数是很显然的事情,不然,函数就变得毫无意义。下面,我们来看一下,如果子类中有函数重载了父类的函数,会是一个什么样子? 那么,对于派生类的实例,其函数表会是下面的一个样子: 我们从表中可以看到下面几点, 1)覆盖的f()函数被放到了表中原来父类函数的位置。 2)没有被覆盖的函数依旧。 对于子类实例中的函数表,是下面这个样子: 我们可以看到: 1) 每个父类都有自己的表。 2) 子类的成员函数被放到了第一个父类的表中。

    64320编辑于 2022-09-14
  • 来自专栏CSDN搜“看,未来”

    再探函数

    必须是函数(派生类一定要重写基类中的函数) ---- Q2:什么是纯函数,与函数的区别 1、定义一个函数函数,不代表函数为不被实现的函数2、纯函数是在基类中声明的函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯函数的方法是在函数原型后加"=0" 3、声明了纯函数的类是一个抽象类。 1、static成员不属于任何类对象或类实例,所以即使给此函数加上virutal也是没有任何意义的。 2、静态与非静态成员函数之间有一个主要的区别,那就是静态成员函数没有this指针。 2函数表类似一个数组,类对象中存储vptr指针,指向函数表。 类 B 对象的存储空间以及函数表(假定类 B 还有其他函数)如图 2 所示。

    1.2K20发布于 2021-10-09
  • 来自专栏给永远比拿愉快

    C++函数

    函数的使用方法(以下内容 摘自《C++面向对象程序》): (1)在基类用virtual声明成员函数函数。     (2)在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的函数相同,并根据派生类的需要重新定义函数体。     C++规定,当一个成员函数被声明为函数后,其派生类中的同名函数都自动成为函数。     什么时候应该把一个成员函数声明为函数呢? (1)首先看成员函数所在的类是否会作为基类。然后看成员函数在类的继承后有无可能被更改功能,如果希望更改其功能的,一般应该讲其声明为函数。 (2)如果成员函数在类被继承后功能不需要修改,或派生类用不到该函数,则不要把它声明为函数

    1.4K30发布于 2019-01-25
  • 来自专栏全栈程序员必看

    函数表详解

    类A包含函数vfunc1,vfunc2,由于类A包含函数,故类A拥有一个表。 图2:对象与它的表 上面指出,一个继承类的基类如果包含函数,那个这个继承类也有拥有自己的表,故这个继承类的对象也包含一个表指针,用来指向它的表。 类A,类B,类C的对象都拥有一个表指针,*__vptr,用来指向自己所属类的表。 类A包括两个函数,故A vtbl包含两个指针,分别指向A::vfunc1()和A::vfunc2()。 类B继承于类A,故类B可以调用类A的函数,但由于类B重写了B::vfunc1()函数,故B vtbl的两个指针分别指向B::vfunc1()和A::vfunc2()。 类C继承于类B,故类C可以调用类B的函数,但由于类C重写了C::vfunc2()函数,故C vtbl的两个指针分别指向B::vfunc1()(指向继承的最近的一个类的函数)和C::vfunc2()。

    1.5K21编辑于 2022-09-19
  • 来自专栏Rice嵌入式

    C++ 多态、函数、纯函数《Rice C++ 学习开发》

    这一篇文章来讲讲C++的多态、函数、纯函数。 C++多态 多态:C++中的多态分为静态多态,动态多态。 (a, b) { } int area() { cout << "Triangle class area :" << endl; return (width * height / 2) : 您可能想要在基类中定义函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对函数给出有意义的实现,这个时候就会用到纯函数。 纯函数就是函数函数主体=0,也就是没有主体。 而纯函数必须在派生类中实现该纯函数。 ②当类中存在纯函数,则该类为抽象类。

    59620编辑于 2022-05-09
  • 来自专栏全栈程序员必看

    函数后面的分号可有可无_函数需要实现吗

    首先理解一下分开的意思 成员函数后面用 const 修饰,const表示this是一个指向常量的指针,即对象成为一个常量,即它的成员不能够变化. 例如在Sales_data成员函数中,this的类型是Sales_data *const,即类一旦实例化一个对象后,this指向这个对象,是不能改变的,但是对象本身可以变) =0表示这个成员函数是纯函数 ,也就是它可以没有定义,只有接口,由它的继承类具体定义它的行为,当然,你也可以给它定义缺省的函数体 一个类里如果包含 =0 的纯函数,那么这个类就是一个抽象类,它不能具体实例化(不能创建它的对象), 而只能由它去派生子类 合起来在函数后面–>纯函数 const 写在函数后头还=0这里不是const=0,函数表示方法是 virtual 返回值 函数名(参数表){函数体} , 在继承的时候可以在子类中从新定义这个函数 如果你的子类中都重新定义了这个函数,那个父类中函数的定义就没有什么用了所以可以不定义只说明就行,也就是定义为纯函数形如: virtual 返回值 函数名(参数表)=0;这里就不用定义实际的函数了。

    47720编辑于 2022-09-23
  • 函数与纯函数的区别:深入解析及应用实例

    本文将深入解析函数与纯函数的区别,并通过实例展示它们在实际编程中的应用。一、函数函数是指在C++中,被virtual关键字修饰的成员函数函数表保存了类中所有函数的地址,通过表指针可以找到对应的函数地址,从而实现动态绑定。函数可以有实现,也可以没有实现。在子类中,函数可以被覆盖,也可以不被覆盖。 如果子类没有覆盖基类的函数,那么当通过基类指针或引用调用该函数时,将调用基类的函数实现。二、纯函数函数是一种特殊的函数,它在声明时除了加上virtual关键字外,还需要加上=0。 三、函数与纯函数的区别定义方式:函数在定义时在普通函数的基础上加上virtual关键字,而纯函数在定义时除了加上virtual关键字外,还需要加上=0。 多态性:函数和纯函数都可以实现多态性,但纯函数更多地用于定义抽象接口,而函数则用于实现具体的多态行为。类类型:包含函数的类可以是普通类,也可以是抽象类;而包含纯函数的类一定是抽象类。

    83110编辑于 2024-11-11
  • 来自专栏秘籍酷

    一口气搞懂《函数和纯函数

    函数的声明语句末尾中加个 =0 ,她就会摇身一变成为纯函数。 子类可以重新定义基类的函数,我们把这个行为称之为复写(override)。 不管是函数还是纯函数,基类都可以为提供他们的实现(implementation),如果有的话子类可以调用基类的这些实现。 子类可自主选择是否要提供一份属于自己的个性化函数实现。 飞行,纯函数 }; 这是一个普通函数,意味着基类希望子类提供自己的个性化实现代码,但基类同时也提供一个缺省的函数实现版本,在子类不复写该函数的情况下作为备选方案 void aircraft::refuel 函数和纯函数都能做到这一点,区别是,子类如果不提供函数的实现,那就会自动调用基类的缺省方案。而子类如果不提供纯函数的实现,则编译将会失败。 第五,函数和普通的函数实际上是存储在不同的区域的,函数所在的区域是可被覆盖(也称复写override)的,每当子类定义相同名称的函数时就将原来基类的版本给覆盖了,另一侧面也说明了为什么基类中声明的函数在后代类中不需要另加声明一律自动为函数

    91620发布于 2019-08-08
领券