class Product
{
...
}
class Perishable : public : Product
{
public:
int getday();
}
int main()
{
Product *temp;
//due to some coding
//temp could point to either Perishable object or Product object that is determine //during runtime
cout<< ((Perishable*)temp)->getday() ;// is there other way to achieve this typecasting seems dangerous
这段代码的问题是,如果temp指向一个Product对象,则temp-> getday()将无效,并且我不知道如何防止这种情况的发生。如果由于某些情况,我只在易腐品中有getday(),而在Product中不具有getday(),我如何检查temp是指向易腐对象还是Product对象?
一些帮助将不胜感激/
}
最佳答案
“此代码的问题在于,如果温度指向Product对象,则temp-> getday()将无效,并且我不知道如何防止这种情况的发生。”
本问题的实质是,如果您绝对不想如其他答案中所述在Product类中声明/实现getday(),则可以使用动态强制转换来确定变量的运行时类型,然后仅调用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.
因此,尝试将变量动态转换为容易腐烂,如果成功,则可以调用getday()。请注意,这不再是多态的,但是在运行时确定类型具有其用途,尤其是当您无法控制正在处理的对象的接口(interface)时。