Почему я не могу сделать полиморфизм с нормальными переменными?

Я программист на Java и недавно начал изучать C ++. Я чем-то смущен.

Я понимаю, что в C ++ для достижения полиморфного поведения вы должны использовать либо указатели, либо ссылки. Например, рассмотрим классShape с реализованным методомgetArea(), У него есть несколько подклассов, каждый переопределяет getArea () по-своему. Чем рассмотреть следующую функцию:

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

Функция вызывает правильныйgetArea() реализация, основанная на конкретномShape указатель указывает на.

Это работает так же:

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

Однако следующий метод не работает полиморфно:

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

Не имеет значения, какой конкретный видShape передается в функции, то же самоеgetArea() реализация называется: по умолчанию вShape.

Я хочу понять технические причины этого. Почему полиморфизм работает с указателями и ссылками, но не с нормальными переменными? (И я полагаю, что это верно не только для параметров функции, но и для чего угодно).

Пожалуйста, объясните технические причины такого поведения, чтобы помочь мне понять.

Ответы на вопрос(4)

Ваш ответ на вопрос