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我在里面添加了另一个编辑,并包含了删除调用。这需要手动,我想,当初始化为新的?