c++利用dynamic_cast实现一个函数解决所有子类问题

dynamic_cast介绍

dynamic_cast<T*><exp>exp是一个指针,该函数将exp所指的对象转换为T类型对象的指针,转换成功返回对象指针,失败返回 NULL
据我所知,当exp是父类指针并指向子类时,可以通过该函数转为该子类指针,转为其它则失败,而且父类中的虚函数是必须的。

code

语言总是苍白无力,让我们看看代码。
先定义爸爸:

struct father {
    int a_;
    string b_;
    father(){}
    father(int a, string b):a_(a),b_(b){}//有参构造函数
    virtual void call() {//虚函数是必须的
        cout << "i am father|" <<a_ <<"|"<<b_<<endl;
    }
};

再定义儿子:

struct  son:father
{
    string c_;
    son(){}
    son(int a,string b,string c):father(a,b),c_(c){}
    void call() {
        cout << "i am son|" << a_ << "|" << b_ <<"|"<< c_<<endl;
    }
};

主函数:

    son s(1, "17", "lovely");//实例化son
    father f(2, "55");//实例化father
    s.call();
    f.call();
    cout << "-----------------------------------------" << endl;
    father* ff = &s;//子类指针给父类指针
    son* t = dynamic_cast<son*>(ff);//父类指针转为子类指针
    if (t != NULL) {//如果转换成功
        t->call();
    }

结果:
outcome
成功转为子类,有了这点,我们就可以开始我们的宏伟大计了!

实现

code

#include<iostream>
#include<string>
using namespace std;
struct People {
    string name_;
    string sex_;
    People(){}
    People(string name,string sex):name_(name),sex_(sex){}
    virtual string toString() {//必须的
        return name_+ "|" + sex_;
    }
};
struct  People_normal:People
{
    People_normal() {}
    People_normal(string name, string sex) :People(name,sex) {}
    string toString() {
        return name_ + "|" + sex_+"|I am normal";
    }
    void scream() {
        cout << "哈~~好开森~~" << endl;
    }
};
struct  People_disabled:People
{
    string withoutPos_;
    People_disabled() {}
    People_disabled(string name, string sex,string withoutPos) :People(name, sex),withoutPos_(withoutPos) {}
    string toString() {
        return name_ + "|" + sex_ + "|I am disabled,I have no "+withoutPos_;
    }
    void call() {
        cout << "呜~~好伤心~~" << endl;
    }
};
void myfun(People* p) {
    cout<<p->toString() << endl;//调用公有的toString(),由于多态,结果会不一样
    People_normal* Pn = dynamic_cast<People_normal*>(p);//指针转换
    People_disabled* Pd = dynamic_cast<People_disabled*>(p);//指针转换
    if (Pn != NULL) {//如果转为People_normal指针成功
        Pn->scream();//调用People_normal特有函数
    }
    if (Pd != NULL) {//如果转为People_disabled指针成功
        Pd->call();//调用People_disabled特有函数
    }
}
int main() {
    People p("peter", "male");
    People_normal pn("anne", "female");
    People_disabled pd("tom", "male","leg");
    myfun(&p);
    myfun(&pn);
    myfun(&pd);

    system("pause");
}

结果

outcome

其它

static_cast<T*>(exp) 几乎和dynamic_cast<T*>(exp) 一样的功能,区别就是转换失败的话,前者不会返回NULL,比较危险。但是当把子类指针转为父类指针时,是安全的,它俩功能也一样。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值