"Проблема с этим кодом в том, что если временная точка указывает на объект Product, temp-> getday () будет недействительным, и я не знаю, как этого избежать."
В духе вопроса, и если вы абсолютно не хотите объявлять / реализовывать getday () в своем классе Product, как упомянуто в других ответах, вы можете использовать динамическое приведение, чтобы определить тип времени выполнения вашей переменной, и тогда вызывайте getday () только если у вас есть скоропортящийся экземпляр:
Product* pPerishable = new Perishable;
Product* pProduct = new Product;
Perishable * pActualPerishable;
pActualPerishable= dynamic_cast<Perishable *>(pPerishable );
//pActualPerishable will not be null because it is of type Perishable at run time
pActualPerishable = dynamic_cast<Perishable*>(pProduct );
//pActualPerishable will be null because you are trying to cast a runtime base type to a derived type.
Итак, попробуйте динамически преобразовать вашу переменную в Perishable, и, если все прошло успешно, вы знаете, что можете вызвать getday (). Обратите внимание, что это больше не полиморфно, но определение типа во время выполнения имеет свои особенности, особенно если у вас нет контроля над интерфейсом объектов, над которыми вы работаете.