я должен вызывать функцию подкласса с указателем суперкласса
Поскольку функции различаются в каждом подклассе, вам придется обращаться к ним из указателей на эти подклассы. -classes.
Это как раз та ситуация, в которой dynamic_cast<>
может помочь: она может условно преобразовать указатель из базового класса в подкласс, если и только если он окажется правильного типа :
void foo(A* a_ptr) {
B* b_ptr = dynamic_cast<B*>(a_ptr);
C* c_ptr = dynamic_cast<C*>(a_ptr);
if(b_ptr) {
b_ptr->QWERTY();
}
if(c_ptr) {
c_ptr->QWERTY();
}
}
It's, however, worth mentioning that this is some pretty ugly code, and might be suitable to solve the quiz you are presenting us, but in a normal environment, there are some design reevaluation that would happen before going to implement things this way.