繁体   English   中英

C++ 中的类型检查

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM