Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 预期的等价性:数据表达式和类型表达式的typeid_C++_Polymorphism_Typeid_Equivalence - Fatal编程技术网

C++ 预期的等价性:数据表达式和类型表达式的typeid

C++ 预期的等价性:数据表达式和类型表达式的typeid,c++,polymorphism,typeid,equivalence,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

我有从基类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;
}
我希望在第一个条件中有一个类型等价性,但结果是比较失败(第一列中为0)。第二个和第三个条件的结果和我预期的一样


第一个条件有什么问题?

您的数组被定义为
A*array[4]
。因此,
array[i]
的类型将是
A*

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

  • typeid(数组[i])==typeid(A)
    将始终为false(即第二列中的0)
  • typeid(数组[i])==typeid(A*)
    始终为真(即第二列中的1)
  • typeid(*array[i])==typeid(A)
    如果数组中有一个新的A项,则可能为true
对于第三种情况,将一个派生对象替换为一个对象


注意:您检查的类型等价是严格的类型等价。这只适用于精确匹配。这意味着对于第二列,对于从B派生的对象,测试将失败。也许这就是您正在寻找的,并且很好。但是,如果您只想检查是调用
mB()
还是
mC()
,这将严重限制多态设计的可扩展性。另外,您可以考虑使用<代码> DyrimCysCase<代码>,并检查它是否返回null pTR或不

您的数组定义为<代码> a*数组[4 ] < /代码>。因此,
array[i]
的类型将是
A*

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

  • typeid(数组[i])==typeid(A)
    将始终为false(即第二列中的0)
  • typeid(数组[i])==typeid(A*)
    始终为真(即第二列中的1)
  • typeid(*array[i])==typeid(A)
    如果数组中有一个新的A项,则可能为true
对于第三种情况,将一个派生对象替换为一个对象


注意:您检查的类型等价是严格的类型等价。这只适用于精确匹配。这意味着对于第二列,对于从B派生的对象,测试将失败。也许这就是您正在寻找的,并且很好。但是,如果您只想检查是调用
mB()
还是
mC()
,这将严重限制多态设计的可扩展性。另外,您可以考虑使用<代码> DyrimCysCase<代码>,并检查它是否返回Null pTR或

谢谢您,克里斯多夫!很好,谢谢你,克里斯托夫!很好。
1. 0 1 0 
2. 0 0 1 
3. 0 0 1 
4. 0 1 0