Chamar um método de classe filho de um objeto de classe pai

Eu tenho as seguintes classes

class Person {
    private String name;
    void getName(){...}}

class Student extends Person{
    String class;
    void getClass(){...}
}

class Teacher extends Person{
    String experience;
    void getExperience(){...}
}

Esta é apenas uma versão simplificada do meu esquema atual. Inicialmente eu não sei o tipo de pessoa que precisa ser criada, então a função que lida com a criação desses objetos leva a geralPerson objeto como um parâmetro.

void calculate(Person p){...}

Agora quero acessar os métodos das classes filhas usando este objeto de classe pai. Eu também preciso acessar métodos de classe pai de vez em quando,Eu não posso fazer isso ABSTRACT.

Eu acho que simplifiquei muito no exemplo acima, então aqui vai, essa é a estrutura real.

class Question {
  // private attributes
  :
  private QuestionOption option;
  // getters and setters for private attributes
  :
  public QuestionOption getOption(){...}
 }

 class QuestionOption{
 ....
 }
 class ChoiceQuestionOption extends QuestionOption{
 private boolean allowMultiple;
 public boolean getMultiple(){...}
 }

 class Survey{
  void renderSurvey(Question q) {
      /*
          Depending on the type of question (choice, dropdwn or other, I have to render
          the question on the UI. The class that calls this doesnt have compile time 
          knowledge of the type of question that is going to be rendered. Each question 
          type has its own rendering function. If this is for choice , I need to access 
          its functions using q. 
      */
      if(q.getOption().getMultiple())
        {...}
  }
 }

A instrução if diz "não é possível localizar getMultiple para QuestionOption". OuestionOption tem muito mais classes filhas que possuem diferentes tipos de métodos que não são comuns entre as crianças (getMultiple não é comum entre as crianças)

questionAnswers(7)

yourAnswerToTheQuestion