Я столкнулся со следующим поведением, написав простую программу, чтобы узнать о виртуальных деструкторах. Я хотел напечатать имя каждого класса, а затем сравнить с типом моего указателя ...

c++
1
TheFallenPickle 2 Янв 2021 в 10:01

1 ответ

Лучший ответ

Это то же самое, что и разница между вызовом виртуальной функции и невиртуальной функции. Вы можете использовать тип выражения или тип объекта. В случае

TimeKeeper *ptk = new AtomicClock(rand());
std::cout << "ptk is of type: " << typeid(*ptk).name() << std::endl;

Выражение *pkt имеет ссылку на тип TimeKeeper, но упомянутый объект имеет тип AtomicClock. Любой тип может быть напечатан с помощью typeid. Разница в том, является ли TimeKeeper полиморфным или нет, то есть есть ли у него какие-либо виртуальные методы (включая виртуальный деструктор). Если TimeKeeper полиморфен, typeid будет использовать тип объекта, в противном случае - тип выражения.

1
john 2 Янв 2021 в 08:05