Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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++_Typeid - Fatal编程技术网

C++ TypeId未按预期打印信息

C++ TypeId未按预期打印信息,c++,typeid,C++,Typeid,可能重复: 我使用的是GCC,下面的代码输出了一些意想不到的东西 #include <iostream> #include <typeinfo> using namespace std; class B { public: B ( B * ptr) { cout<< typeid(*ptr).name()<<endl;} }; class D : public B { public: D() : B(this) { cout

可能重复:

我使用的是GCC,下面的代码输出了一些意想不到的东西

#include <iostream>
#include <typeinfo>
using namespace std;

class B {
  public:
  B ( B * ptr) { cout<< typeid(*ptr).name()<<endl;}
};

class  D : public B {
  public:
  D() : B(this) { cout<<typeid(this).name()<<endl;}
};

int main()
{
    D d;
    return 0;
}
有人能给我解释一下为什么基类不能正确地判断派生类的类型吗? 非常感谢

两个原因:

  • 对象(
    *ptr
    )尚未完全构建
  • 您的类不是多态的(没有虚拟成员函数),因此不存在动态类型信息
  • 原因有二:

  • 对象(
    *ptr
    )尚未完全构建
  • 您的类不是多态的(没有虚拟成员函数),因此不存在动态类型信息

  • 这取决于编译器。msvc为此提供了不同的typeid字符串。

    这取决于编译器。msvc为此提供了不同的typeid字符串。

    另请参见:另请参见:但typeid信息在编译时不是已知的吗?如果在编译时已知,则在运行时应打印派生类名。@lorex:
    *ptr
    的动态类型在编译时未知。它还没有完全建成,我现在明白了。很多感谢,但typeid信息在编译时不知道吗?如果在编译时已知,则在运行时应打印派生类名。@lorex:
    *ptr
    的动态类型在编译时未知。它还没有完全建成,我现在明白了。非常感谢
    1B
    P1D