Динамическое приведение к подклассу, а затем присвоение результата указателю на суперкласс бесполезно - вы практически вернулись к тому, с чего начали. Вам нужен указатель на подкласс для хранения результата динамического приведения. Кроме того, если конкретный тип вашего объекта PersonClass
, вы не можете уменьшить его до подкласса. Динамическое приведение может работать только для вас, если у вас есть указатель на суперкласс, но вы знаете, что указанный объект на самом деле является экземпляром подкласса .
Как и другие отмечали, лучшим вариантом будет перепроектировать иерархию классов, чтобы сделать ваши методы по-настоящему полиморфными, что исключит необходимость снижения производительности. Поскольку вы не можете прикоснуться к этим классам, вам нужен удрученный. Типичный способ использовать это будет что-то вроде
PersonClass* person = // get a Person reference somehow
if(/* person is instance of LawyerClass */)
{
LawyerClass* lawyer = dynamic_cast<LawyerClass*>(person);
lawyer->GoToCourt();
}
else
{
DoctorClass* doctor = dynamic_cast<DoctorClass*>(person);
doctor->GoToSurgery();
}
Обновление: если вы хотите использовать экземпляры подкласса позже, вы можете сделать это следующим образом:
PersonClass* person = // get a Person reference somehow
...
LawyerClass* lawyer = NULL;
DoctorClass* doctor = NULL;
if(/* person is instance of LawyerClass */)
{
lawyer = dynamic_cast<LawyerClass*>(person);
}
else if(/* person is instance of DoctorClass */)
{
doctor = dynamic_cast<DoctorClass*>(person);
}
...
if(lawyer)
{
lawyer->GoToCourt();
}
else if (doctor)
{
doctor->GoToSurgery();
}
Обратите внимание, что этот код более сложен и более подвержен ошибкам, чем предыдущая версия. Я определенно попытался бы реорганизовать такой код, чтобы он больше походил на предыдущую версию. YMMV.