目录
Dynamic_cast类型转换运算符的使用
相较于static_cast的优点
Static_cast是在编译时发挥类型转换的作用,而dynamic_cast是在执行期间进行类型的转换。因此当你不知道类型转换有没有成功的时候,使用dynamic_cast进行错误检查是个不错的选择。当类型转换没成功时,会返回一个null指针,这样我们就可以用返回指针的值来判断转换有没有成功。但是编译过程中执行类型转换要比边执行程序边类型转换要快,效率要高,因此当我们已知类型转换一定会成功时(比如:派生类指针一定会类型转换成基类指针),我们应该用static_cast类型转换符,因为这样在保证了安全的基础上又提高了效率。
代码示例
#include <iostream>
#include <string>
using namespace std;
class Cperson
{
private:
string name;
int age;
public:
Cperson(string name, int age)
{
this->name = name;
this->age = age;
}
virtual ~Cperson() // 详细请参考我的“虚析构函数”这篇文章
{
cout << "调用Cperson析构函数" << endl;
}
virtual void ShowInf()
{
cout << this->name << "的年龄为" << this->age << endl;
}
};
class Cstudent: public Cperson
{
private:
float mark;
public:
Cstudent(float mark, string name, int age) :Cperson(name, age)
{
this->mark = mark;
}
~Cstudent()
{
cout << "调用Cstudent的析构函数" << endl;
}
void ShowInf()
{
cout << "该学生的成绩为" << this->mark << endl;
}
};
void Converter(Cperson *person) // 指针性质发生变化仅仅代指指针所指向的有效区域发生改变
{
Cstudent *stud = dynamic_cast<Cstudent*>(person);
if (stud != NULL) // 对指针进行检验是一种编程的好习惯
{
stud->ShowInf(); // 先用if判断指针内容再进行相应代码的执行,可以增强代码可读性
}
}
int main()
{
Cstudent *stud = new Cstudent(99.99, "超级霸霸强", 19);
Converter(stud); // 传入的指针为派生类指针,这里发生了隐式类型转换
delete stud; // 用new内存切记要使用delete释放
}
注:这种在运行阶段识别对象类型的机制称为运行阶段类型识别(runtime type identification,RTTI)。
这里我们用if判断语句,判断传入指针的类型,这里切记:不相关的类型之间不可以发生转换,派生类可以向基类发生转换,但是基类不能向派生类发生转换,因为派生类包含基类,因此基类包含的数据少,派生类包含的数据多,你如果只初始化部分数据,那其他未初始化的派生类成员数据就充满了不确定性,因此这样做会发生不可预知的错误。
由以上陈述可以得知:当我们传入一个基类的指针,dynamic_cast<Cstudent*>(person)会返回null,即返回空指针。