gpt4 book ai didi

c++ - Typeinfo 如何在多态集合中获取类的名称/ID?

转载 作者:行者123 更新时间:2023-12-03 06:52:39 26 4
gpt4 key购买 nike

在下面的例子中,我不希望 stdout : Base Foo Bar ,但我得到 P4Base P4Base P4Base :

#include <iostream>
#include <typeinfo>
#include <vector>
#include <memory>

class Base {};
class Foo : public Base {};
class Bar : public Base {};

using Collection = std::vector<std::unique_ptr<Base> >;

int main() {
Collection collection;
collection.push_back(std::make_unique<Base>());
collection.push_back(std::make_unique<Foo>());
collection.push_back(std::make_unique<Bar>());
for (auto &u:collection)
std::cout << typeid(u.get()).name() << std::endl;
}
有没有办法正确识别我的集合中有哪种实例?
编辑
遵循 eerorika 建议的工作示例
struct Base {virtual ~Base() = default;};
struct Foo : public Base {};
struct Bar : public Base {};

using Collection = std::vector<std::unique_ptr<Base> >;

int main() {
Collection collection;
collection.push_back(std::make_unique<Base>());
collection.push_back(std::make_unique<Foo>());
collection.push_back(std::make_unique<Bar>());
for (auto &u:collection)
std::cout << typeid(*u).name() << std::endl;
}

最佳答案

Typeinfo how to get the name/id of the class in a polymorphic collection?


  • 首先,为了typeid,类必须是多态的。提供动态类型。你的类不是多态的,所以你会得到静态类型。
  • 其次,您必须对指向的对象使用左值而不是指针。申请typeid to a pointer 为您提供指针类型的类型信息,而不是指向对象的类型。
  • 第三,你的程序的行为是未定义的,因为派生对象是通过非虚拟析构函数指向基类的指针来销毁的。

  • 要修复第一点和第三点,请为基础提供一个虚拟析构函数。修复第二个:
    typeid(*u).name()
    最后,您对可读类名的期望是错误的。 std::type_info::name不能保证给你你为类(class)写的名字。结果是实现定义的,在实践中,您通常会得到类型的重整名称。没有获得可读名称的标准方法,但是有实现定义的方法来对名称进行解构。

    关于c++ - Typeinfo 如何在多态集合中获取类的名称/ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64884297/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com