вот такой код
class A1
{
public:
int ini1;
int i;
A1()
{
ini1 = 1;
}
virtual ~A1() {}
virtual void func1()
{
i = 0;
}
};
class B1: public A1
{
public:
int j;
B1() : j(0) {}
virtual void func1()
{
j = 3;
}
};
...
A1* pa1 = new A1;
B1* pb1 = new B1;
A1* sdfs = dynamic_cast<A1*>(pb1);
B1* pb2 = dynamic_cast<B1*>(pa1);
pb2 = 0 в результате.
Почему??
rtti включено
Здравствуйте, Amouse, Вы писали:
A>pb2 = 0 в результате.
A>Почему??
потому, что dynamic_cast
работает
Здравствуйте, Amouse, Вы писали:
A>вот такой код
A> A1* pa1 = new A1;
A> B1* pb1 = new B1;
A> A1* sdfs = dynamic_cast<A1*>(pb1);
A> B1* pb2 = dynamic_cast<B1*>(sdfs);
A>
A>pb2 = 0 в результате.
A>Почему??
A>rtti включено
Вот так будем работать. У вас не работает, потому что pa1 исходно указывает на А*, и dynamic_cast не находит у него информации, позволяющей преобразовать его к В*.
Здравствуйте, Amouse, Вы писали:
A>A>class A1;
A>class B1: public A1;
A> A1* pa1 = new A1;
A> B1* pb2 = dynamic_cast<B1*>(pa1);
A>
A>pb2 = 0 в результате.
A>Почему??
A>rtti включено
Отключи RTTI и используй reinterpret_cast.

А потом посмотри, что получится и всё тебе откроется.
Серьёзно. Попробуй вызвать func1 или уточнить значение B1::j.
Здравствуйте, McQwerty, Вы писали:
MQ>Серьёзно. Попробуй вызвать func1 или уточнить значение B1::j.
И мы увидим новую тему от ТС: "не работает компилятор, выдает фигню".
Я бы посоветовал ТСу не заниматься шаманством и не пытаться выяснить опытным путем, как работают всякие хитрые аспекты С++.
Гораздо продуктивнее сначала почитать документацию или (если документация слишком забубенная) — статейки всякие. Например, вот тут неплохо расписаны касты в С++:
http://stackoverflow.com/questions/28002/regular-cast-vs-static-cast-vs-dynamic-cast
Здравствуйте, Mr.Delphist, Вы писали:
MD>Тут это... порой даже при this==NULL порой можно позвать методы (если виртуальности нет). Будьте осторожны в сових желаниях.
+100500

тем более, что тут рядом буквально с неделю назад был топик на тему "как такое может быть, что this==null"