繁体   English   中英

如何比较 C++ 中两个向下转换的 object 类型

[英]How to compare two downcasted object types in C++

我有两个从 Base class 继承的对象。 两者都存储在向量中:

std::vector<Base*> m_vector;

如何检查第一种类型的 object 是否等于第二种类型的 object?

场景:

1.

  • 第一个 object 类型: A: public Base
  • 第二 object 类型: B: public Base
  • 结果:不相等
  • 第一个 object 类型: A: public Base
  • 第二 object 类型: A: public Base
  • 结果:相等
  • 第一个 object 类型: A: public Base
  • 第二 object 类型: B: public A
  • 结果:不相等

我正在简化很多事情以说明问题。 你有一个

std::vector<Base*> m_vector;

这基本上意味着:您有一个指向B的指针向量。 实际对象是多态的,这意味着只要它们从B继承,您就不必关心实际类型是什么。

现在你想做一些需要你知道元素的实际类型的事情。

那是一个矛盾。

解决这个矛盾最简单的方法是放弃第二点:不要关心实际类型是什么,只使用基础 class 中定义的接口。

一种方法是使用typeid 例如:

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

struct Base {
    bool same_type(const Base& other) {
        return typeid(*this) == typeid(other);
    }
    virtual ~Base() = default;
};

struct A : Base {};
struct B : Base {};

int main() {
    std::vector<std::unique_ptr<Base>> x;
    x.emplace_back(std::make_unique<A>());
    x.emplace_back(std::make_unique<B>());
    x.emplace_back(std::make_unique<B>());
    
    std::cout << "expect 0 : " << (x[0]->same_type(*x[1])) << "\n";
    std::cout << "expect 1 : " << (x[1]->same_type(*x[2])) << "\n";
}

有关typeid的详细信息,请参阅https://en.cppreference.com/w/cpp/language/typeid

正如评论中所建议的,您实际上不需要编写Base::same_type()但您可以直接使用typeid

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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