大挪耗

c++如何取代虚函数

#include "iostream"  //包含头文件。
#include "functional"
using namespace std;

struct Hero
{

    //虚函数方法
//    virtual void show()
//    {
//        cout<<"英雄释放了技能。\n";
//    }
function<void()>m_callback;//用于绑定子类的成员函数。
    //注册子类成员函数,子成员函数没有参数。
    template<typename Fn,typename ...Agrs>
    void callback(Fn&& fn,Agrs &&...agrs)
    {
        m_callback=bind(forward<Fn>(fn),forward<Agrs>(agrs)...);
    }
    void show(){m_callback();}//调用子类的成员函数。
};

struct XS:public Hero
{//西施释放了技能
    void show(){cout<<"西施释放了技能、\n";}
};

struct HX:public Hero
{
    void show()
    {
        cout<<"韩信释放了技能.\n";
    }
};

int main()
{
    //根据用户选择的英雄,施展技能。
    int id=0;
    cout<<"请输入英雄(1-西施;2-韩信。)";
    cin>>id;

    //创建基类指针,将指向派生类的对象,用基类指针调用派生类成员函数。
    Hero *ptr= nullptr;
    if(id==1)//1-西施
    {
        ptr=new XS;
        ptr->callback(&XS::show,static_cast<XS*>(ptr));//注册回调函数
    } else if(id==2)
    {
        ptr=new HX;
        ptr->callback(&HX::show,static_cast<HX*>(ptr));//注册回调函数
    }

    if(ptr!= nullptr)
    {
        ptr->show();//用基类指针调用派生类的成员函数。
        delete ptr;//释放派生类东西。
    }
}

请输入英雄(1-西施;2-韩信。)1
西施释放了技能、


已发布

分类

可以收藏大挪耗一下。下载麻烦点城通网盘,站长保证下载速度,不会限速的,放心点就是了;分卷,安卓下载为txt:程序下载为url,不会下载参考不会下载。如果你想让本站活的久一点,请直接捐助

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注