在看项目代码的时候,看到dynamic_cast<type>将一个类转变成另一个类,回想我学过的知识这个并不会所以从网上学习了一下,总结一下
dynamic_cast<type>用于虚基类转换成派生类的一种强制转换,注意dynamic_cast转换符只能用于含有虚函数的类
以下是我创建的四个类,people类虚继承teacher和student,非虚继承parent
class teacher
{
public:
virtual void Teach()
{
cout << "i am Teacher" << endl;
}
};
class student
{
public:
virtual void Stu()
{
cout << "i am Student" << endl;
}
};
class parent
{
public:
void Parent()
{
cout << "i am Parent" << endl;
}
};
class people :public parent , public virtual teacher , public virtual student
{
public:
};
基类<-派生类(切片原理,可以直接转换)
虚基类->派生类(报错,无法直接转换)
那加个类型强转呢?
采用dynamic_cast<type>强转试试?
虚基类->派生类
由上面的图可以看出,虚基类都可以使用dynamic_cast<>进行强制转换,但是parent非虚继承的类则不能使用dynamic_cast<>
pa1只能采用非虚继承强转
RTTI:Run Time Type Identification,即通过运行时类型识别。程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。
C++提供的在RTTI机制中,逻辑上,存在类似如下的内存模型图:
在这个内存模型中:
每个类都会在内存中保存一份类型信息,编译器会将存在继承关系的类的类型信息使用指针“连接”起来,从而形成一个继承链(Inheritance Chain)。
dynamic_cast使用注意事项:
1)查找规则:当使用 dynamic_cast 对指针进行类型转换时,会先找到该指针指向的对象,再根据对象找到当前类(指针指向的对象所属的类)的类型信息,并从此节点开始沿着继承链向上遍历(注意是向上),如果找到了要转化的目标类型,那么说明这种转换是安全的,就能够转换成功,如果没有找到要转换的目标类型,那么说明这种转换存在较大的风险,就不能转换。
2)作用对象:注意dynamic_cast转换符只能用于含有虚函数的类。
原文链接:https://blog.csdn.net/liranke/article/details/5145787
个人简单总结:dynamic_cast用于基类转换成派生类,基类可以是虚基类也可以是非虚基类,但是内部必须要有虚函数,如果内部没有虚函数便无法使用,可以使用非虚基类继承