LINUX.ORG.RU

История изменений

Исправление alysnix, (текущая версия) :

но в процессе оказалось, что в некоторых случаях необходим обратный каст.

и это правильно, поскольку обьекты разных потомков, и ты строго говоря не знаешь, имея указатель на базу, на какой в реальности обьект он указывает, у тебя ж в списке они разнородные. на самом деле если ты строго уверен, что каст пройдет, то есть уверен в типе обьекта потомка, по какому-то тегу, ты может кастовать статически.

class A{

};

class B: public A{

};

void ff(){
	A* lp = new B;
	B* lpp = static_cast<B*>(lp);
};

то есть храни в предке тег класса(перечисление), и потом, определив по тегу актуальный класс кастуй в него статиком. я так и делаю. единственно что, если ты ошибся в таком касте - у тебя будет бага в рантайме.

Исходная версия alysnix, :

но в процессе оказалось, что в некоторых случаях необходим обратный каст.

и это правильно, поскольку обьекты разных потомков, и ты строго говоря не знаешь, имея указатель на базу, на какой в реальности обьект он указывает, у тебя ж в списке они разнородные. на самом деле если ты строго уверен, что каст пройдет, то есть уверен в типе обьекта потомка, по какому-то тегу, ты может кастовать статически.

class A{

};

class B: public A{

};

void ff(){
	A* lp = new B;
	B* lpp = static_cast<B*>(lp);
};

то есть храни в предке тег класса(перечисление), и потом, определив по тегу актуальный класс кастуй в него статиком.