代码之家  ›  专栏  ›  技术社区  ›  Chubsdad

多态类型的typeid

  •  9
  • Chubsdad  · 技术社区  · 14 年前

    我希望这段代码打印“相同的1” “Same2”,但它只打印“Same1”:

    #include <iostream>
    #include <typeinfo>
    using namespace std;
    
    struct C{virtual ~C(){}};
    struct D : C{};
    int main(){
       D d;
       C c, &cr1 = d;
       if(typeid(cr1) == typeid(D)) cout << "Same1";
       if(typeid(&cr1) == typeid(D*)) cout << "Same2";
    }
    

    5.2.8/2和5.3.1/3似乎都建议打印“Same2”。

    什么?在哪里?

    1 回复  |  直到 14 年前
        1
  •  17
  •   MSalters    14 年前

    指针不是多态类型。他们没有虚拟成员。事实上,他们没有任何成员。它们也不能从其他类型派生,也不能用作基类。因此,静态和动态类型 T* 总是 T型* .

    在“Same2”行中,比较的是指针的typeid,而不是指向对象的typeid。因此,编译器只查看静态类型 C* D* . 它们显然不一样,而且一定是不同的 type_info 物体。