[英]Type checking in C++
在 C++ 中,我想知道对象的实际类型是否来自同一个类,而不是同一个类或派生类。 这类似于以下 C# 代码:
Class Base
{
}
Class Child:Base
{
}
Base childObject = new Child();
If (childObject.GetType() == typeof(Child))
{
// do some code
}
谢谢!
有两种方法可以做到这一点。 首先,您可以使用typeid
运算符,它返回一个type_info
结构,其中包含有关对象类型的信息。 例如:
Base* ptr = /* ... */
if (typeid(*ptr) == typeid(DerivedType)) {
/* ... ptr points to a DerivedType ... */
}
请注意,您必须在此处使用typeid(*ptr)
而不是typeid(ptr)
。 如果您使用typeid(ptr)
,那么您将返回Base*
的type_info
对象,因为无论指针指向什么,指针都具有Base*
类型。
需要注意的重要一点是,这将检查ptr
指向的内容是否恰好是DerivedType
。 如果ptr
指向派生自DerivedType
类型的对象(可能是EvenMoreDerivedType
),则此代码将无法正常工作。
检查您是否指向更健壮的某种类型的对象的另一种方法是使用dynamic_cast
运算符。 dynamic_cast
在运行时执行检查的类型转换,如果转换成功,它将产生一个有效的指针,否则将产生nullptr
。 例如:
Base* ptr = /* ... */;
auto* derived = dynamic_cast<DerivedType*>(ptr);
if (derived) {
/* ... points to a DerivedType ... */
}
这有一个额外的好处,如果ptr
指向类似EvenMoreDerivedType
东西, EvenMoreDerivedType
仍然会成功,因为EvenMoreDerivedType
继承自DerivedType
。
最后,您有时会看到这样的代码:
Base* ptr = /* ... */
if (auto* derived = dynamic_cast<DerivedType*>(ptr)) {
/* ... points to a DerivedType ... */
}
这将局部作用域指向if
语句主体的derived
指针,并使用非零值在 C++ 中求值为true
。 我个人认为这更易于阅读且不易出错,但无论如何,请选择对您来说最简单的方法。
希望这有帮助!
虽然 DeadMG 的答案是正确的(我已经多次使用 typeid),但我想我会把它扔给后代。 从面向对象的角度来看,执行此操作的“正确”方法是:
Class Base
{
virtual void something() {
// probably a no-op, but maybe some default stuff
}
}
Class Child : public Base
{
virtual void something() {
// do your child-specific code here
}
}
Base* childObject = new Child();
childObject->something(); // does the right thing
您可以使用 typeid()。
if (typeid(childObject) == typeid(ChildType)) {
}
如果返回 true,则您知道它是子类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.