c++ - 运行时类型信息的奇怪行为

标签 c++ rtti typeid

我有两个类 BaseDerived 如下:

class Base
{
public:
};

class Derived : public Base
{
public:
};

和主要功能:

int main()
{
    Base* ptr = new Derived;

    std::cout << typeid(*ptr).name() << endl;

    delete ptr;

    system("pause");
}

程序输出显示 class Base,我预计它会显示 class Derived。但是当我在 Base 类中添加一个虚拟方法时,现在输出显示 class Derived!

为什么 RTTI 至少需要一个虚方法?

最佳答案

因为语言规范是这么说的。 RTTI 仅适用于多态类型;也就是说,具有虚函数的类型。对于其他类型,typeid 返回其参数的静态类型的类型信息。

如果你问的是这样做的理由:它有一个运行时成本(通常,每个对象中的一个指针指向每个类的元数据,它支持虚拟调度和 RTTI),并且它会是一个如果您不得不为所有类型支付该价格,则感到遗憾,无论您是否想在它们上使用 RTTI。

关于c++ - 运行时类型信息的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28092974/

相关文章:

c++ - 绕过 RTTI 的不同方法的优点

c++ - 用于 RTTI 的 Boost 库

c++ - 您可以使用类型信息查找类型吗?

c++ - 使用 typeid 运算符的最佳替代方案

c++ - 如何在 C++ 中键入

c++ - SetupDiGetDriverInfoDetail失败。 SP_DRVINFO_DETAIL_DATA的大小是否太小?

c++ - 从 .cpp 文件读取时出现问题

c++ - 如何避免模版函数调用不明确?

c++ - 在 C++ 中,类型名称的 typeid 总是在编译时求值吗?

c++ - 处理点击 3d 对象 opengl