使用函数指针实现父类函数调用子类函数的两种方式

news/2025/2/11 14:18:42/

本文将介绍如何在继承关系中实现父类函数调用子类函数的两种方法。

父子类关系

在继承关系中,子类是父类的一种特殊形式,子类继承了父类的属性和行为。因此,子类可以访问父类的所有非私有成员。相反,父类通常不能访问子类的成员。然而,我们可以通过一些方法间接地实现父类访问子类,即父类函数访问子类函数。

方法一:利用多态机制

一个指向子类的父类指针或引用,当调用被子类重写的虚函数时,实际上调用的是子类函数。这是通过多态的方式来实现父类调用子类。该方法需要一个引用或者指针调用虚函数来实现。
参考之前发的博客:C++子类实现父类纯虚函数实现父类获取子类信息

上面的例子就是通过多态实现的父类调用子类成员函数,这里面必须要有虚函数,并且在子类里面重写。

方法二:通过函数指针

通过函数指针同样可以实现父类函数访问子类函数,示例代码如下:

#include<iostream>
using namespace std;
class Base {public:typedef void (Base::*pfn)();void CallFunction() {if(fn != NULL) {(this->*fn)();  //调用Derived类中的fun()函数}}void SetPfn(pfn fn) {this->fn = fn;}pfn fn;};class Derived : public Base {public:void Init() {SetPfn((pfn)&Derived::fun);}void funDer() {(this->*fn)();}void fun() {std::cout << "Derived::fun be called in Base function!" << std::endl;}};
int main() {Derived derived;derived.Init();derived.CallFunction();//这里调用的是父类的成员函数,该函数通过函数指针调用了子类的普通成员函数,调用结果输出:"Derived::fun be called in Base function!",即父类成员函数调用了子类成员函数。derived.funDer();//这里是在子类中调用父类的成员变量,该变量是函数指针指针调用了子类的普通成员函数,调用结果输出:"Derived::fun be called in Base function!",即父类成员函数调用了子类成员函数。
}

关于函数指针

函数指针在C++中有许多优点:

  • 灵活性:函数指针可以在运行时决定调用哪个函数,这使得程序更加灵活。例如,你可以根据用户的输入或其他条件来决定调用哪个函数。

  • 回调函数:函数指针常常用于实现回调函数,这是一种在特定事件或条件发生时自动执行的函数。例如,你可以创建一个函数,当某个特定事件发生时,这个函数就会被自动调用。

  • 抽象和封装:函数指针可以用于实现抽象和封装。你可以创建一个接受函数指针作为参数的函数,然后在这个函数内部调用传入的函数。这样,你就可以在不知道具体实现的情况下调用函数,只需要知道函数的接口。

  • 实现多态:在C++中,虽然我们有虚函数来实现多态,但在某些情况下,我们也可以使用函数指针来实现多态。例如,你可以创建一个基类指针,然后将它指向一个派生类对象,然后通过这个指针调用派生类的函数。

  • 性能优化:在某些情况下,使用函数指针可以提高程序的性能。例如,如果你有一个经常被调用的小函数,你可以将它的地址存储在一个函数指针中,然后通过这个指针来调用这个函数,这样可以避免每次都要查找这个函数的地址。

总的来说,函数指针是一种非常强大的工具,它可以使你的程序更加灵活,更加抽象,也可以帮助你优化你的程序。

爱死C++了,家人们 谁懂啊,太神奇了。


http://www.ppmy.cn/news/170875.html

相关文章

vep文件转换mp4翻录教程

很多伙伴遇到下载的视频资料是.vep格式&#xff0c;需要指定的播放器才能观看&#xff0c;正常的视频播放器是看不了的。 基于之中情况可以用我们这个教程转换为mp4。 提前是必须有授权能播放才可以&#xff01; 教程获取&#xff1a; https://jsxc6933.gitee.io/shipin/pa…

ev4加密视频转mp4工具使用教程

第一步、按winr键&#xff0c;输入cmd&#xff0c;进入main.exe的文件夹下 第二步、在命令行中输入 main空格要解密的ev4文件 支持一个视频一个视频转 也支持多个视频一起转&#xff08;需要把所有的ev4文件 放到一个文件夹下&#xff09;该资源会自己扫描文件夹&#xff0c;找…

ev4转换为mp4转换工具 ev4加密视频破解工具

前几天买了一套视频教程&#xff0c;被无良商家欺骗下载了一套ev4加密的视频 。苦于没有授权密码无法播放。 今天教大家一个简单的办法可以把ev4格式的视频转换为mp4格式的。这样就可以用任意播放器都可以播放了&#xff0c;重要的是不需要知道授权密码也可以转换&#xff01;…

ev4转换mp4转换工具 ev4转换为mp4 无须授权密码

大家下载教程的时候很多教程都是ev4格式的视频&#xff0c;这种视频是需要授权密码才能播放的。 遇到这种情况&#xff0c;可以用本程序&#xff0c;可以把 .ev4格式的视频转换为 .mp4格式的。 这样就可以用任意播放器播放该视频了&#xff0c;最重要的是无须知道授权密码也可以…

ev4转换成MP4格式方法【无视授权密码,亲测有效】

测试时间&#xff1a;2022/05/22 1.获取解压包 连接在这下载连接&#xff0c;后台回复ev4获取资源&#xff0c;点赞关注更好了&#xff0c;嘿嘿 2. 配置python环境&#xff0c; 软件依赖于python2.7.9&#xff0c;所以要安装python包&#xff0c;具体详情在文档里了&#xf…

饺子播放器使用IJKPlayer播放MP4文件

JZVideo项目地址 问题汇总 视频设置禁止回退快进&#xff0c;如果还需要视频画面上的点击事件&#xff0c;可以采用第二种方法 MyJzvdStd.findViewById(R.id.bottom_seek_progress).setOnTouchListener(new View.OnTouchListener() {Overridepublic boolean onTouch(View v, …

怎么把m2ts改成mp4

怎么把m2ts改成mp4&#xff1f;m2ts 是一种视频文件格式&#xff0c;常见于DV拍摄中&#xff0c;高清摄影机用的也很多。但是我们在刻录、播放、编辑过程中&#xff0c;可能需要进行格式转换。通常我们把m2ts改成mp4格式。 怎么把m2ts改成mp4&#xff1f;我们往往通过电脑进行…

战狼2百度云资源Mp4观看【Mp4/2.5G国语BD】战狼2云盘链接迅雷BT下载edk

《战狼2电影》高清完整版点击观看>>http://kanayi.cn<<点击观看《三生三世电影》高清完整版点击观看>>http://kanayi.cn<<点击观看 战狼2百度云资源Mp4观看【Mp4/1.32G国语BD】战狼2云盘链接迅雷BT下载edk分谨慎的人&#xff0c;既然见到这个有可能克制…