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();
}
结果:
成功转为子类,有了这点,我们就可以开始我们的宏伟大计了!
实现
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");
}
结果
其它
static_cast<T*>(exp)
几乎和dynamic_cast<T*>(exp)
一样的功能,区别就是转换失败的话,前者不会返回NULL,比较危险。但是当把子类指针转为父类指针时,是安全的,它俩功能也一样。