在 c++ 面向对象使用中,我们常常会定义一个基类类型的指针,在运行过程中,这个指针可能指向一个基类类型的对象,也可能指向的是其子类类型的对象,那现在问题来了,我们如何去判断这个指针到底执行了一个什么类型的对象呢?
今天我们就聊一下这个问题,首先我们要区分是否允许 RTTI
,据此有不同办法。
1 允许使用 RTTI
在打开 rtti 的场景下,可以使用 dynamic_cast
和 typeid
这两个运算符来判断对象的真实类型。
1.1 使用 dynamic_cast
dynamic_cast
用于在运行时进行多态类型检查和转换,它可以将指向基类的指针转换为指向派生类的指针或引用。如果转换成功,则说明对象属于目标类或其派生类。如果转换失败,则返回空指针。
我们看如下例子,我们想判断指针 basePtr
是否指向了 Child2
类型的对象。总共进行了两次测试,第一次让该指针指向了 Child1
类型的对象,第二次则是指向了 Child2
类型的对象。
#include <iostream>
class Basic {
public:
virtual void say() {
std::cout << "我是基类" << std::endl;
}
};
class Child1 : public Basic {
public:
void say() {
std::cout << "我是 child 1" << std::endl;
}
};
class Child2 : public Basic {
public:
void say() {
std::cout << "我是 child 2" << std::endl;
}
};
int main()
{
Basic* basePtr;
basePtr = new Child1();
if (dynamic_cast
文章评论