Когда dynamic_cast <void *> полезен?
5.2.7/7 говорит что-то вроде:
Если T
является "указателем на cv void
", результатом является указатель на самый производный класс, на который указывает x
.
Какое хорошее применение этого синтакса? Когда следует использовать dynamic_cast<void*>
?
Ответы
Ответ 1
Одной из распространенных причин является выяснение того, являются ли два интерфейса IA*
и IB*
фактическими указателями на один и тот же базовый объект. Если вам это нужно, используйте бросок.
IIRC, возможно даже в случае множественного наследования с повторяющейся не виртуальной базой иметь два указателя IA*
, которые сравнивают неравные, но указывают на один и тот же объект, потому что они указывают на два разных подобъекта IA
.
Ответ 2
Если у вас есть что-то вроде:
template<typename X, typename Y>
bool operator==(const X* px, const Y* py) {
return dynamic_cast<void*>(px) == dynamic_cast<void*>(py);
}