运行时类型识别

运行时类型识别#

#include <iostream>

using namespace std;

class Person
{
protected:
    string name;

public:
    Person(string name = "") : name(name){};
    virtual ~Person() {}
    string getInfo() { return name; }
};

class Student : public Person
{
    string studentid;

public:
    Student(string name = "", string sid = "") : Person(name), studentid(sid){};
    string getInfo() { return name + ":(" + studentid + ")"; }
};

int main()
{
    Person person("Yu");
    Student student("Sam", "20210212");
    Person *pp = &student;
    Person &rp = student;
    Student *ps = (Student *)&person; // danger!
    cout << "person.getInfo():" << person.getInfo() << endl;
    cout << "pp->getInfo():" << pp->getInfo() << endl;
    cout << "rp.getInfo():" << rp.getInfo() << endl;
    cout << "ps->getInfo():" << ps->getInfo() << endl; // danger if getInfo is not virtual

    char *p = (char *)100;
    // ps = dynamic_cast<Student*>(&person);
    // printf("address = %p\n", ps);
    // pp = dynamic_cast<Person*>(&student);
    // printf("address = %p\n", pp);
    return 0;
}