Потому что, если вы передадите по значению, тогда произойдет разрезание объекта , и полиморфизм во время выполнения не может быть достигнут. А в вашем коде сама строка Material m = Texture()
вызывает нарезку объектов. Таким образом, даже если вы передадите m
по указателю (или ссылке), полиморфизм во время выполнения не будет достигнут.
Кроме того, полиморфизм времени исполнения достигается через:
- указатель базового типа или
- ссылка базового типа
Итак, если вы хотите полиморфизм во время выполнения, вы используете либо указатель , либо ссылку базового типа, и вот несколько примеров, как вы можете достичь полиморфизма во время выполнения:
Material* m1 = new Texture();
poly->setMaterial(m1); //achieved
Texture* t1= new Texture();
poly->setMaterial(t1); //achieved
Texture t2;
poly->setMaterial( &t2); //achieved : notice '&'
Material & m2 = t2;
poly->setMaterial( &m2 ); //achieved : notice '&'
Material m3;
poly->setMaterial( &m3 ); //NOT achieved : notice '&'
Только в последней строке вы не достигнете полиморфизма во время выполнения.