Я наткнулся на один фрагмент кода, где typeid
используется для получения типа unique_ptr
, указывающего на полиморфный объект.
class B{virtual void foo()= 0;};
class D:public B{void foo() override{}};
int main()
{
unique_ptr<B> bd = make_unique<D>();
if (typeid(*bd) != typeid(bd.get()))
{
cout<<"Object types are not same"<<endl;
}
cout<<"Type name of *bd.name(): "<<typeid(*bd).name()<<endl;
cout<<"Type name of bd.get().name(): "<<typeid(bd.get()).name()<<endl;
}
Вывод:
Object types are not of same
Type name of *bd.name(): 1D
Type name of bd.get().name(): P1B
Вывод name()
отличается для get () и разыменования с помощью *. Еще одно наблюдение состоит в том, что когда в классе не определены виртуальные функции [без void foo()
в вышеприведенном примере], оба get () и * выводят один и тот же вывод.
Вопросы:
Почемуget () и * выдают различный вывод, когда в классе нет виртуальных функций?
Живой пример: https://gcc.godbolt.org/z/Tiy-Cn
EDIT-1 Согласно * для unique_ptr , там написано "Возвращает объект, принадлежащий * this, эквивалентно * get ()."