Por que não consigo fazer polimorfismo com variáveis normais?

Sou programador Java e recentemente comecei a estudar C ++. Estou confuso com alguma coisa.

Eu entendo que em C ++, para obter um comportamento polimórfico, você precisa usar ponteiros ou referências. Por exemplo, considere uma classeShape com um método implementadogetArea(). Possui várias subclasses, cada uma substituindo getArea () de maneira diferente. Considere a seguinte função:

void printArea(Shape* shape){
    cout << shape->getArea();
}

A função chama o corretogetArea() implementação, com base no concretoShape o ponteiro aponta para.

Isso funciona da mesma maneira:

void printArea(Shape& shape){
    cout << shape.getArea();
}

No entanto, o método a seguir não funciona polimorficamente:

void printArea(Shape shape){
    cout << shape.getArea();
}

Não importa que tipo concreto deShape é passado na função, o mesmogetArea() implementação é chamada: a padrão emShape.

Eu quero entender o raciocínio técnico por trás disso. Por que o polimorfismo funciona com ponteiros e referências, mas não com variáveis normais? (E suponho que isso seja verdade não apenas para parâmetros de função, mas para qualquer coisa).

Por favor, explique as razões técnicas para esse comportamento, para me ajudar a entender.

questionAnswers(4)

yourAnswerToTheQuestion