Как указал Nemanja Boric, один из вариантов заключается в использовании Dynamic Cast. Однако использование динамического переноса может быть дорогостоящим для некоторых компиляторов, таких как MSVC, которые будут запускать строку при оценке указателя.
Другой вариант, который у вас есть, - использовать Static Cast. Static Casts оценивается во время компиляции, поэтому практически нет затрат на их использование. Тем не менее, вам все равно придется определять тип вашего класса, чтобы знать, что его использовать. В вашем базовом классе вы можете иметь чистый виртуальный метод, называемый getType(), который возвращает нумерованное значение или целое число без знака, которое представляет собой идентификатор для класса. Затем вы можете проверить внутри «someOtherMethod», какой тип идентификатора прошел полученный класс, а затем выполнить приведение к этому типу класса.
Э.Г.
Определено в какой-то файл является перечисление с типами
enum ClassTypes
{
ClassType1,
ClassType2,
...
};
В качестве примечания: если вы не меняется, что указывает на PObj вы хотите, чтобы сделать указатель Уст. Это позволяет читателю знать, что вы не намерены его менять, а также- форма защитного программирования против вашего величайшего врага (самостоятельно), убедившись, что вы случайно не изменили его, а затем попытайтесь выполнить бросок на нем ,
int someOtherMethod(Parent * const pObj)
{
if(pObj == NULL)
return 0;
switch(pObj->getType())
{
case ClassType1:
{
Class1 * const pClass = static_cast<Class1*>(pObj);
//Do stuff to class type 1
break;
}
case ClassType2:
{
Class2 * const pClass = static_cast<Class2*>(pObj);
break;
}
};
return 1;
}
Как вы можете видеть, хотя это может расти очень быстро, и оно не обрабатывает дублирующий код. Кроме того, Static Cast может быть опасным, потому что во время выполнения нет проверки, чтобы узнать, может ли ваше кастинг иметь смысл, что может привести к сбою.
Вы должны рассмотреть дизайн самого класса. Возможно, какой-то код, который вы хотели выполнить в этой функции, вы могли бы выполнить в самом классе. Поэтому вместо того, чтобы знать тип, вы можете просто сказать:
pObj-> someOtherMethod(), где someOtherMethod - это чистая виртуальная функция, которую должны определить все ваши дети. Вы можете снова запустить дублированный код в нескольких определениях методов, и в этом случае могут понадобиться некоторые шаблоны проектирования, такие как шаблон NVI.
Опубликовать свой реальный код, желательно скомпилированный – yngccc
«передать дочерний объект методу, но не знать тип объекта раньше времени» <это не означает, что тип является дочерним? ???? – marcadian
@marcadian Тип объекта может быть любым из примерно 4 унаследованных типов: Child1, Child2 и т. Д. –