LINUX.ORG.RU

dynamic_cast или что-то по-проще.


0

1

Простой тестовый код:

#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'ом конечно же все работает верно.

★★★★★

Последнее исправление: Jetty (всего исправлений: 1)
Ответ на: комментарий от Boy_from_Jungle

а за него вообще руки не отрывают?

Вроде как он иногда нужен в сильно низкоуровневых вещах. Так что если прокомменрировано его использование, ИМХО всё нормально. А вот за сишные приведения типов отрывать руки надо однозначно.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

можно ведь на void это всё привести, а уже потом к какой-то-endian последовательности.

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

Там сплошные reinterpret_cast'ы и const_cast'ы. Причем их использование вполне оправдано.

elverion
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.