假设我有一个抽象基类 Parent 和子类 Child1 和 Child2。如果我有一个接受 Parent* 的函数,有没有办法(可能使用 RTTI?)在运行时确定该函数实际收到的是 Child1* 还是 Child2*?
到目前为止,我在这里使用 RTTI 的经验是,当 foo 是 Parent* 时,typeid(foo) 返回 typeid(Parent*) 而不管 foo 属于哪个子类。
假设我有一个抽象基类 Parent 和子类 Child1 和 Child2。如果我有一个接受 Parent* 的函数,有没有办法(可能使用 RTTI?)在运行时确定该函数实际收到的是 Child1* 还是 Child2*?
到目前为止,我在这里使用 RTTI 的经验是,当 foo 是 Parent* 时,typeid(foo) 返回 typeid(Parent*) 而不管 foo 属于哪个子类。
您需要查看取消引用指针的 typeid,而不是指针本身;即,typeid(*foo),而不是 typeid(foo)。询问取消引用的指针将为您提供动态类型;如您所见,询问指针本身只会为您提供静态类型。
你可以用std::dynamic_cast
这个。
Parent* ptr = new Child1();
if(dynamic_cast<Child1*>(ptr) != nullptr) {
// ptr is object of Child1 class
} else if(dynamic_cast<Child2*>(ptr) != nullptr) {
// ptr is object of Child2 class
}
此外,如果您使用智能指针,例如std::shared_ptr
,您可以像这样检查它:
std::shared_ptr<Parent> ptr(new Child1());
if(std::dynamic_pointer_cast<Child1>(ptr) != nullptr) {
// ptr is object of Child1 class
} else if(std::dynamic_pointer_cast<Child2>(ptr) != nullptr) {
// ptr is object of Child2 class
}
当然:
BaseClass *bptr = // whatever, pointer to base class
SubclassOne *safe_ptr_one = dynamic_cast<SubclassOne *>(bptr);
if (safe_ptr_one != nullptr) {
// Instance of SubclassOne
} else {
// not an instance of SubclassOne, try the other one
SubclassTwo *safe_ptr_two = dynamic_cast<SubclassTwo *>(bptr);
if (safe_ptr_two != nullptr) {
// Instance of SubclassTwo
} else {
// it wasn't either one :'(
}
}