Dynamic_cast does not work - depending on OS version

I have a dynamic cast that does not work. The layout of the class is as follows:

class A1
{
    public:
virtual int foo1()=0;
};

class A2
{
    public:
    virtual int foo2();
};

class A3
{
public:
   virtual int foo3();
};

class B : public A1, public A2, public A3 
{
   int bar();
};

Now I use pointers (so slicing cannot happen) for downcast.

main()
{
   B b;

   A1* a1 = dynamic_cast<A1*> (&b); // ok
   B*  b1 = dynamic_cast<B*>  (a1); // ok

   A2* a2_1 = dynamic_cast<A2*> (a1); // OSX 10.7 ok, OSX 10.9 fail
   A2* a1_2 = dynamic_cast<A2*> (b1); // ok

};

Killed works, upcast works, but sidecast does not always work. Sidecast works on OSX 10.7, but it doesn't work on OSX 10.9 (GCC 4.2 uses dynamic C ++ stdlib). Looking at vtable with gdb, I can clearly see how the methods and members of A2 are listed.

My questions:

a) sidecast? ?
b) sidecast , ? , ? c) dynamic_cast ( ) ?

: ,

11/01/15 14: 16: 27,435 APPNAMECHANGED [15280]: dynamic_cast error 1: _ . . 10A1, 15A2.

, c) , , OSX 10.9. . (Linux, -?) . (gcc.gnu.org/wiki/Visibility)

- . " ", , - - info ( ODR ++ - ). , , , typeinfos; typeinfo vtable , EH, , .

:

d) , , ? .o?

+4
2

, , dylib, ++, (gcc 4.8 vs clang).

0

: ). >

, B [class.virtual]/1, (, B ).
[expr.dynamic.cast]/8:

C - , T, :

  • , () v, v ()     C, , (), C  to v () C.
  • , v () C, , () C .
  • .

, , .

0

Source: https://habr.com/ru/post/1570710/


All Articles