C++ - Understand RTTI

对于非多态类型的对象(所谓多态类型就是存在基类和虚方法的类),对于这类对象,RTTI的信息并不是运行时获取的,而是在编译时生成的,例如:

int main()
{
    char buffer[MAX_PATH] = { 0 };
    const auto &ti = typeid(buffer);
    cout << ti.name();
}

输出:

char [260]

对于多态类型的对象,RTTI的信息则是运行时获取的,之所以要求有虚方法和继承关系就是因为RTTI的信息可以存储在virtual table中(猜想)

class A {
    int a;
public:
    A() {
        a = 0xAABBCCDD;
    }
    virtual void func() {}
};
 
class B : public A {
    int b;
public:
    B() {
        b = 0x12345678;
    }
    virtual void func() {}
};
 
int main()
{
    A * a = new A();
    A * b = new B();
    cout << sizeof(*b) << endl;
 
    const auto &t = typeid(*b);
    cout << t.name() << endl;
}

输出:

8
class B

但是同样上面的代码,如果注释掉一行,结果就截然不同,类型信息就是编译时获取的

lass A {
    int a;
public:
    A() {
        a = 0xAABBCCDD;
    }
    //virtual void func() {}

};
 
class B : public A {
    int b;
public:
    B() {
        b = 0x12345678;
    }
    virtual void func() {}
};
 
int main()
{
    A * a = new A();
    A * b = new B();
    cout << sizeof(*b) << endl;
 
    const auto &t = typeid(*b);
    cout << t.name() << endl;
}

输出:

4
class A