typeid работает не так как ожидается

Я ожидаю, что typeid динамически определяет тип данного ему объекта

Son a;
Mom& c = a;
std::cout << typeid(a).name() << '\n' << typeid(c).name();

Однако данный код выводит. Тоесть typeid не смотрит на тип объекта, который в действительности лежит под этим адресом?

Son
Mom

Ответы (2 шт):

Автор решения: user394173
#include <iostream>
#include <typeinfo>

struct Mom {
    virtual int foo() {
        return 42;
    }
};

struct Son : Mom {
    virtual int foo() {
        return 43;
    }
};

int main () {
    Son* s = new Son{};
    Mom* m = new Son{};

    std::cout << typeid(*s).name() << '\n' << typeid(*m).name() << '\n';
}

Вывод одинаковый.

#include <iostream>
#include <typeinfo>

struct Mom {
    // virtual int foo() {
    //     return 42;
    // }
};

struct Son : Mom {
    // virtual int foo() {
    //     return 43;
    // }
};

int main () {
    Son* s = new Son{};
    Mom* m = new Son{};

    std::cout << typeid(*s).name() << '\n' << typeid(*m).name() << '\n';
}

Вывод разный.

typeid() работает по-разному в зависимости от наличия/отсутствия виртуальных функций.

→ Ссылка
Автор решения: AR Hovsepyan

Рассмотрим понятия растение и цветок. Цветок, это разновидность растения, поэтому когда вас просят принести растение, вы спокойно можете принести цветок. Но, тот кто просит вам принести растение, будет рассматривать этот цветок только как растение(ссылаться на нее как растение), и это не будет ошибкой, поскольку ему не нужны особенности цветочка, которые отличают ее от других растений, ему нужно, допустим, лишь провести анализ фотосинтеза в растении... Такой же принцип наследования поддерживается и в С++. Когда вы ссылаетесь на объект, не важно на что вы ссылаетесь, он будет рассматриваться как ссылочный тип, в данном случаи как Mom.

→ Ссылка