Простой тестовый код:
#include <cstdio>
class A {
public:
virtual void test() = 0;
};
class B: public A {
public:
virtual void test() {};
};
class C: public B {
public:
virtual void test() {};
};
int main() {
B *cB = new B();
C *cC = new C();
A *base_p=NULL;
printf("pointers base_p=%p cB=%p cC=%p\n", base_p, cB, cC);
C *p2=NULL;
base_p = (A *) cC;
p2 = (C *) base_p;
printf("pointers base_p=%p p2=%p\n", base_p, p2);
base_p = (A *) cB;
p2 = (C *) base_p;
printf("pointers base_p=%p p2=%p\n", base_p, p2);
return 0;
}
Непонятно почему в конце, p2 после приведения к типу (С *) указывает на объект который (В *) и вообще непонятно почему он привелся, ведь по факту не должен.
Ткните, если можно, где почитать о том, почему так происходит.
P.S. С dynamic_cast'ом конечно же все работает верно.