博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用函数指针实现父类函数调用子类函数的两种方式
阅读量:4303 次
发布时间:2019-05-27

本文共 1214 字,大约阅读时间需要 4 分钟。

父子类关系

对于继承关系中的父类和子类,我们可以说子类是父类的一种,子类继承了父类的属性和行为。因此,子类可以访问父类的所有非私有成员。相反,父类一般情况下是不能访问子类成员的。然而,我们可以通过一些方法间接的实现父类访问子类,即父类函数访问子类函数。

方法一

利用多态机制,一个指向子类的父类指针或引用,当调用被子类重写的虚函数时,实际上调用的是子类函数,这是通过多态的方式来实现父类调用子类,该方法需要一个引用或者指针调用虚函数来实现。如下面所示:

Class Base{public:    virtual void fun()    {        std::cout << "Base::fun()" << std::endl;    }};class Derived : public Base{public:    virtual void fun()    {        std::cout << "Derived::fun()" << std::endl;    }};Base* base = new Derived;base->fun();    //该结果输出为: "Derived::fun()"

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

方法二

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

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

程序执行结果如下:

这里写图片描述

你可能感兴趣的文章
java中的IO操作总结(一)
查看>>
java中的IO操作总结(二)
查看>>
java中的IO操作总结(三)
查看>>
java中的IO操作总结(四)
查看>>
Java 内部类种类及使用解析
查看>>
匿名内部类精讲
查看>>
如何在ubuntu下设置永久的alias别名
查看>>
如何安装安装nginx软件--nginx的自动安装
查看>>
ubuntu下编译php扩展的时候报缺少pcre解决办法
查看>>
linux下安装安装pcre configure: error: You need a C++ compiler for C++ support
查看>>
ubuntu下nginx的安装教程(过程可能有点不同)
查看>>
nginx+php(fastcgi)安装教程
查看>>
linux命令(1):wget命令
查看>>
linux命令(2):gzip命令
查看>>
Linux命令(3)打Patch的方法
查看>>
linux命令(4)curl命令详解
查看>>
Apache与Nginx的优缺点比较
查看>>
Ubuntu中安装zlib
查看>>
configure: error: C++ compiler cannot create executables
查看>>
linux命令(5)Ubuntu apt-get安装卸载命令
查看>>