c++ - 预期等价物 : typeid of data expression and type expression

标签 c++ polymorphism typeid equivalence

我有从基类 A 派生的多态类:

class A {
public:
    virtual void fV() { }
};

class B : public A {
public:
    void mB() { }
};

class C : public A {
public:
    void mC() { }
};

我现在想遍历指向此类对象的数组并检查类型等价性:

A *array[4] = { new B, new C, new C, new B };
for(int i = 0; i < 4; ++i) {
    cout << i + 1 << ". " ;
    (typeid(array[i]) == typeid(A)) ? cout << 1 << ' ': cout << 0 << ' ';
    (typeid(*array[i]) == typeid(B)) ? cout << 1 << ' ': cout << 0 << ' ';
    (typeid(*array[i]) == typeid(C)) ? cout << 1 << ' ': cout << 0 << ' ';
    cout << endl;
}

结果是:

1. 0 1 0 
2. 0 0 1 
3. 0 0 1 
4. 0 1 0 

我希望在第一个条件下类型等价,但结果我得到了一个失败的比较(第一列中的 0 0 0 0)。第二个和第三个条件的结果符合我的预期。

第一个条件有什么问题?

最佳答案

您的数组定义为 A* array[4] .所以 array[i] 的类型将是 A* .

因此,对于第二列(索引后的第一列):

  • typeid(array[i]) == typeid(A)将始终为假(即第二列中的 0)
  • typeid(array[i]) == typeid(A*)永远为真(即第二列中的 1)
  • typeid(*array[i]) == typeid(A)如果您的数组中有一个新的 A 项,则可能为真。

Online demo对于第三种情况,用 A 对象替换其中一个派生对象。

警告:您检查的类型等价是严格类型等价。这仅适用于完全匹配。这意味着对于第二列,对于从 B 派生的对象,测试将失败。也许这就是您正在寻找的并且很好。但是这会严重限制你的多态设计的可扩展性,如果你打算只是检查是否调用 mB()mC() .或者你可以考虑使用 dynamic_cast<>并检查它是否返回 nullptr

关于c++ - 预期等价物 : typeid of data expression and type expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39104160/

相关文章:

java - 如何在 iOS 上的 Turbo 模块中发出事件

c++ - 从C++中的函数返回

c++ - 是否可以从 C++ 中的模板类型获取 char* 名称

c++ - 通过网络在不同平台之间比较 boost::typeindex type hash_code() 是否安全?

c++ - 一个数组最多可以分成多少个子数组,使得不同子数组中任意两个元素的GCD始终为1?

c++ - 模板参数可以是表达式吗?

c# - 协方差如何比多态性更酷……而不是多余的?

c++ - typeid() 面向对象的设计替代方案

c++ - XPending 函数被阻塞

php - PHP中看似多态的东西真的是多态吗?