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)时。

09-30 20:14