C++ 条件句对C++;?(包含多态性)

C++ 条件句对C++;?(包含多态性),c++,oop,polymorphism,conditional,inclusion,C++,Oop,Polymorphism,Conditional,Inclusion,我遇到了一个有趣的错误,我很确定这与条件语句上下文中的包含多态性有关 该示例的亮点如下所示: ClassParent *parentPointer; //Declare pointer to parent if(condition){ ClassChild1 = mychild; //Declare child1 object parentPointer = *mychild;//Parent pointer points to child }

我遇到了一个有趣的错误,我很确定这与条件语句上下文中的包含多态性有关

该示例的亮点如下所示:

   ClassParent *parentPointer; //Declare pointer to parent

   if(condition){
       ClassChild1   = mychild; //Declare child1 object
       parentPointer = *mychild;//Parent pointer points to child
   }

   if(!condition){
       ClassChild2   = mychild; //Declare child2
       parentPointer = *mychild;//Parent pointer points to child2  
   }

   cout << *parentPointer; //What will this point to???
ClassParent*parentPointer//声明指向父级的指针
如果(条件){
ClassChild1=mychild;//声明child1对象
parentPointer=*mychild;//父指针指向子指针
}
如果(!条件){
ClassChild2=mychild;//声明child2
parentPointer=*mychild;//父指针指向child2
}

cout具有自动存储的对象是它们周围的大括号(包括
if
语句)的本地对象。如果您有一个指向本地对象的指针,并且该对象超出范围,则访问该指针是错误的

Object* ptr;
if (condition)
{
    Object obj;
    ptr = &obj;
} //obj is out of scope
*ptr; //undefined behaviour
这就是将
refitem
设置为指向本地对象所做的操作。相反,使用
new
创建一个
易腐*
不易腐*
,当块结束时,将该指针指定给
refitem
。多态性将如您所期望的那样工作,错误只是对象的范围

if (!isPerishable)
{
    NonPerishable* myitem = new NonPerishable(); //dynamic memory
    std::cin >> *myitem;
    refitem = myitem; //refitem is still valid after this scope ends
}

具有自动存储功能的对象位于它们周围的大括号中,包括
if
语句。如果您有一个指向本地对象的指针,并且该对象超出范围,则访问该指针是错误的

Object* ptr;
if (condition)
{
    Object obj;
    ptr = &obj;
} //obj is out of scope
*ptr; //undefined behaviour
这就是将
refitem
设置为指向本地对象所做的操作。相反,使用
new
创建一个
易腐*
不易腐*
,当块结束时,将该指针指定给
refitem
。多态性将如您所期望的那样工作,错误只是对象的范围

if (!isPerishable)
{
    NonPerishable* myitem = new NonPerishable(); //dynamic memory
    std::cin >> *myitem;
    refitem = myitem; //refitem is still valid after this scope ends
}

真的是这样吗?我认为这是一个直接的错误。一切似乎都是正确的,只是我必须包含一个尊重运算符(*),以便cin>>匹配。我提出了一个编辑建议。@ YZT我真的希望编译器能够发出警告,但显然不是。@ JamesRoot - C++不象java,很遗憾。@ JAMESROST我在里面添加了另一个编辑,并包含了删除调用。我想这需要手动,当用new初始化时?它真的是UB吗?我认为这是一个直接的错误。一切似乎都是正确的,只是我必须包含一个尊重运算符(*),以便cin>>匹配。我提出了一个编辑建议。@ YZT我真的希望编译器能够发出警告,但显然不是。@ JamesRoot - C++不象java,很遗憾。@ JAMESROST我在里面添加了另一个编辑,并包含了删除调用。这需要手动,我想,当初始化为新的?