大挪耗

c++typeid运算符和type_info

#include "iostream"
using namespace std;
class AA
{
public:
    AA(){}
};

class Hero
{
public:
    int viability;//生存能力
    int attack;//攻击伤害
    virtual void skill1(){cout<<"英雄释放了一技能.\n";}
    virtual void skill2(){cout<<"英雄释放了二技能.\n";}
    virtual void uskill(){cout<<"英雄释放了大招.\n";}
};

class XS:public Hero//西施派生类
{
public:
    void skill1(){cout<<"西施释放了一技能.\n";}
    void skill2(){cout<<"西施释放了二技能.\n";}
    void uskill(){cout<<"西施释放了大招.\n";}
    void show(){cout<<"我是西施.\n";}
};

class LB:public Hero//
{
public:
    void skill1(){cout<<"李白释放了一技能.\n";}
    void skill2(){cout<<"李白释放了二技能.\n";}
    void uskill(){cout<<"李白释放了大招.\n";}
};

class HX:public Hero//
{
public:
    void skill1(){cout<<"韩信释放了一技能.\n";}
    void skill2(){cout<<"韩信释放了二技能.\n";}
    void uskill(){cout<<"韩信释放了大招.\n";}
};

int main(){
    //typied用于c++内置的数据类型.
    int ii=3;
    int* pii= &ii;
    int & rii=ii;
    cout<<"typeid(int)="<< typeid(int).name()<< endl;
    cout<<"typeeid(ii)="<< typeid(ii).name()<<endl;
    cout<<"typeid(int *)="<<typeid(int *).name()<<endl;
    cout<<"typeid(pII)="<< typeid(pii).name()<<endl;
    cout<<"typeid(int &)="<< typeid(int &).name()<<endl;
    cout<<"typeid(rii)="<< typeid(rii).name()<<endl;
    //typeid用于自定义的数据类型
    AA aa;
    AA* paa= &aa;
    AA& raa= aa;
    cout<<"typeid(AA)="<< typeid(AA).name()<<endl;
    cout<<"typeid(aa)="<< typeid(aa).name()<<endl;
    cout<<"typeid(AA *)="<< typeid(AA*).name()<< endl;
    cout<<"typeid(paa)-="<< typeid(paa).name()<<endl;
    cout<<"typeid(AA &)"<< typeid(AA&).name()<< endl;
    cout<<"typeid(raa)="<< typeid(raa).name()<<endl;

    //type_info重载了==和!=运算符,用于对类型进行比较.
    if(typeid(AA)== typeid(aa))cout<<"ok1\n";
    if(typeid(AA)== typeid(*paa))cout<<"ok2\n";
    if(typeid(AA)== typeid(raa))cout<<"ok3\n";
    if(typeid(AA)== typeid(paa))cout<<"ok4\n";


    //根据用户选择英雄,施展一技能,二技能和大招.
    int id=0;//英雄的id.
    cout<<"请输入英雄(1-西施,2,-韩信,3-李白):";
    cin>>id;

//    if(id==1)//西施
//    {
//        XS h;
//        h.skill1();
//        h.skill2();
//        h.uskill();
//    } else if(id==2)//韩信
//    {
//     HX h;
//     h.skill1();
//     h.skill2();
//     h.uskill();
//    } else if(id==3)//李白
//    {
//        LB h;
//        h.skill1();
//        h.skill2();
//        h.uskill();
//    }

    Hero* ptr=nullptr;
    if(id==1)//1-西施
    {
        ptr=new XS;
    } else if(id==2)//2-韩信
    {
        ptr=new HX;
    } else if(id==3)//3-李白
    {
        ptr=new LB;
    }
    if(ptr!= nullptr)
    {
        ptr->skill1();
        ptr->skill2();
        ptr->uskill();
    }
//如果基类指针指向的对象是西施,那么是调用西施的show()函数。
    if(typeid(XS)== typeid(*ptr)){
        XS* pxs=(XS*)ptr;//c风格的强制转转换的方法,程序员必须目标类型正确.
        pxs->show();
    }
    XS* xsptr=dynamic_cast<XS*>(ptr);//把基类指针转换为派生类.
    if(xsptr!=nullptr)xsptr->show();//如果转换成功,调用派生类西施的非虚函数.

    delete ptr;
    ptr= nullptr;

    return 0;
}

输出:

typeid(int)=i
typeeid(ii)=i
typeid(int *)=Pi
typeid(pII)=Pi
typeid(int &)=i
typeid(rii)=i
typeid(AA)=2AA
typeid(aa)=2AA
typeid(AA *)=P2AA
typeid(paa)-=P2AA
typeid(AA &)2AA
typeid(raa)=2AA
ok1
ok2
ok3
请输入英雄(1-西施,2,-韩信,3-李白):1
西施释放了一技能.
西施释放了二技能.
西施释放了大招.
我是西施.
我是西施.


已发布

分类

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

发表回复

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