C++ what can make type_info::hash_code differs for two (supposedly) same objects
NickName:brahmin Ask DateTime:2015-06-11T06:43:08

C++ what can make type_info::hash_code differs for two (supposedly) same objects

After trying to debug an unsuccessful dynamic downcasting, I eventually found that the reason probably is: type_info::hash_code for the type it is casted to is not the same depending where in the code it is called. type_info::name stays exactly the same though. Unfortunately I'm unable to reproduce the behavior in a minimal example since it appears in a quite entangled context. Therefore I'm essentially looking for clues of what can be the cause of such behavior, and consequently what direction I can take to solve this.

In short, if related, type looks like this (EDITED):

class A {...}

template < template <class> class>
class B : virtual public A {...}

template < template <class> class>
class C : virtual public A {...}

template < template <class> class>
class D : public B, public C {...}

template <class>
class E {...}

Issue looks like this:

D<E>* d = build_d();    
B<E>* b = d; 
A* a = d;     

dynamic_cast<D<E>*>(b);//returns correct pointer
dynamic_cast<D<E>*>(a);//returns 0, and really shouldn't !!

typeid(B<E>).hash_code();//differing depending where in the code this is called

Calls to type_info::hash_code are done inside different libraries (of my own). After digging, I found about compiler option -rdynamic with GCC (even if I'm using Clang). I'm not sure if it can be related to my problem in any way.


EDIT: I eventually found a good clue. No solution yet unfortunately. It appears the problem may be Qt related in the end.

Issue occurs in a slot function. When the slot is called by a signal, dynamic_cast downcasting fails. But if I manually call the slot instead (in main for instance), it succeeds. And if manually call the slot, then trigger it by the signal, it succeeds too. There's no argument for the signal, and content of the slot has been "neutralized" and doesn't depend of any parameter. 99,99% sure problem is not due to an algorithm error of allocation.

It looks like qt_static_metacall, when calling the slot, somehow lose the track of casting properties. Is the fact the associated moc being precompiled can have something to do with this ?

Copyright Notice:Content Author:「brahmin」,Reproduced under the CC 4.0 BY-SA copyright license with a link to the original source and this disclaimer.
Link to original article:https://stackoverflow.com/questions/30768565/c-what-can-make-type-infohash-code-differs-for-two-supposedly-same-objects

More about “C++ what can make type_info::hash_code differs for two (supposedly) same objects” related questions

Is there any difference between C c; and C c = C();?

#include&lt;iostream&gt; using namespace std; class C{ private: int value; public: C(){ value = 0; cout&lt;&lt;"default constructor"&lt;&lt;endl; }

Show Detail

Rebinding C-c to C-c

I'm using Viper, and I want to change its C-c and C-g to the original emacs functions. I can rebind C-g with (define-key viper-vi-global-user-map "C-g" 'keyboard-quit), but how can I rebind C-c, si...

Show Detail

Why value of variable c in (c=c==c) is 2 instead of 1,in C programming?

#include&lt;stdio.h&gt; int main() { int a=10,b=2,c; a=!++b&amp;&amp;(c=c==c); printf("b value is %d \n",b); printf("c value is %d \n",c);

Show Detail

The difference between "C c = new C()" and "A c = new C()" when C is a subclass of A in Java

Let's say we have class A as a parent class, and class C that extends it. class A { void m() { System.out.println("A.m"); } } class C extends A { @Override v

Show Detail

Mounting of /cygdrive/c resolves to C:\cygdrive\c

I am using Cygwin and try to run a bash script which uses the pwd command to construct a path and then generate a directory. The problem is that the directory is created under c:\cygdrive\c rather ...

Show Detail

Prefix key `C-S-c` is echoed as `C-c`

When I press C-S-c, the echo area shows only C-c. Things like C-S- selection do work, however. I'm in Ubuntu 14.10 Utopic Unicorn in case this helps. Here's the code for the key binding (for mul...

Show Detail

What is the difference between C, C99, ANSI C and GNU C?

I have started programming practice on codechef and have been confused by the difference between C and C99. What does C mean here? Is it C89? Check the languages at the bottom of this submit. It co...

Show Detail

Is C# a superset of C?

Is C# a superset of C in anyway, like Objective-C or C++? Is there a way to compile C online with constructs such compiler flags?

Show Detail

C - Scope of C Functions

I apologize if this is a beginner's question, but after working in C for a bit, I finally would like a bit of clarification on exactly what kind of files/functions are available to a function. I

Show Detail

Why a != b != c is not equal to a != b and a != c and b != c?

I want to check if 3 values a, b , c are not equal to each other. Given that a == b == c equals to a == b and b == c and a == c, why does python give a different answer for a != b != c ? Thanks! ...

Show Detail