C++高级面试题:解释 C++ 中的 RTTI(Run-Time Type Information)。

解释 C++ 中的 RTTI(Run-Time Type Information)。

C++ 中的 RTTI(Run-Time Type Information)是一种机制,用于在运行时获取对象的实际类型信息。RTTI 允许程序在运行时动态地确定对象的类型,从而进行类型检查和类型转换。

RTTI 主要由两个关键的运算符实现:

dynamic_cast 运算符:用于在继承层次结构中进行安全的向下转型(downcasting),即将基类指针或引用转换为派生类指针或引用。如果转换失败,dynamic_cast 返回空指针(对指针进行转换)或引发 std::bad_cast 异常(对引用进行转换)。

typeid 运算符:用于获取对象的实际类型信息。typeid 运算符接受一个表达式作为参数,并返回一个 std::type_info 对象,该对象包含有关表达式的类型信息。可以使用 std::type_info 对象的成员函数 name() 来获取类型的名称。

以下是一个简单的示例,演示了如何使用 dynamic_cast 运算符进行类型转换和 typeid 运算符获取对象的实际类型信息:

#include <iostream>
#include <typeinfo>

// 基类
class Base {
public:
    virtual ~Base() {}
};

// 派生类1
class Derived1 : public Base {
public:
    void func1() {
        std::cout << "Derived1::func1() called" << std::endl;
    }
};

// 派生类2
class Derived2 : public Base {
public:
    void func2() {
        std::cout << "Derived2::func2() called" << std::endl;
    }
};

int main() {
    Base* ptr1 = new Derived1();
    Base* ptr2 = new Derived2();

    // 使用 dynamic_cast 进行类型转换和类型检查
    Derived1* d1 = dynamic_cast<Derived1*>(ptr1);
    if (d1) {
        d1->func1();
    } else {
        std::cout << "ptr1 is not of type Derived1" << std::endl;
    }

    Derived2* d2 = dynamic_cast<Derived2*>(ptr1);
    if (d2) {
        d2->func2();
    } else {
        std::cout << "ptr1 is not of type Derived2" << std::endl;
    }

    // 使用 typeid 运算符获取对象的实际类型信息
    std::cout << "ptr1 is of type: " << typeid(*ptr1).name() << std::endl;
    std::cout << "ptr2 is of type: " << typeid(*ptr2).name() << std::endl;

    delete ptr1;
    delete ptr2;

    return 0;
}

在这个示例中,我们创建了两个指向派生类对象的基类指针 ptr1 和 ptr2。然后使用 dynamic_cast 运算符将 ptr1 转换为 Derived1* 类型,并调用 func1();由于 ptr1 指向的是 Derived1 类型的对象,转换成功。然后尝试将 ptr1 转换为 Derived2* 类型,转换失败,因为 ptr1 指向的不是 Derived2 类型的对象。接着使用 typeid 运算符获取 ptr1 和 ptr2 指向对象的实际类型信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值