Исправляя ошибку в огромной кодовой базе, я наблюдаю странную ситуацию, когда динамический тип ссылки изменяется с Типа оригинала Derived
на тип Base
!Я предоставляю минимальный код для объяснения проблемы:
struct Base {
// some 'virtual' function
protected: // copy constructor
private: // assignment operator
};
struct Derived : Base {
... // There are few more classes between `Base` and `Derived`
... // but for simplicity, I have put direct relation
};
void foo (Base &ref)
{
SomeClass obj;
obj.pVoid = &ref; // pVoid is of void*
// ----> typeid(ref) = Derived
(*funcptr)(obj);
// ----> typeid(ref) = Base !!!
Derived *p = dynamic_cast<Derived*>(&ref); // this fails ... i.e. "p = 0"
}
funcptr
- указатель на функцию (void (*)(SomeClass&)
).funcptr
может указывать на очень много функций, и они имеют свои собственные потоки вызовов, поэтому отладка будет затруднена.
Очень странно, что после вызова указателя на функцию производный тип ref
изменяетсяот Derived
до Base
.Чтобы упростить мою работу, я подозревал, что разделение объектов будет с Derived
до Base
, поэтому я сделал ~Base()
как чистый virtual
и перекомпилировал весь исходный код.Но не было никакой ошибки компилятора, что означает, что не было объявлено объекта Base
.
Каковы потенциальные причины того, что динамический тип ref
Derived
изменяется на Base
и dynamic_cast
терпит неудачу позже?