C中的指针,多态和分段错误
发布时间:2020-12-16 06:45:42 所属栏目:百科 来源:网络整理
导读:我有一个有很多孩子的家长班. Parent类中的每个函数都是纯函数,即函数没有父实现,但子函数有自己的实现.无需在那里发布代码 – 标准的东西. 我不希望人们从任何地方创建父类的直接实例化.通过让虚拟功能保持纯净,我可以安全地防范这种情况. 我的问题:根据用
我有一个有很多孩子的家长班. Parent类中的每个函数都是纯函数,即函数没有父实现,但子函数有自己的实现.无需在那里发布代码 – 标准的东西.
我不希望人们从任何地方创建父类的直接实例化.通过让虚拟功能保持纯净,我可以安全地防范这种情况. 我的问题:根据用户的输入(字符串),我想实例化其中一个孩子.我只知道运行时哪一个.我的(不正确的?)想法是以下编译好并且正常工作,直到我将代码放入函数并返回父级. 这样可行: Parent* parent; if(user_input == "A") { Child1 child1; parent = &child1; } else if(user_input == "B") { Child2 child2; parent = &child2; } 但这不起作用: Parent* foo(string user_input) { Parent* parent; if(user_input == "A") { Child1 child1; parent = &child1; } else if(user_input == "B") { Child2 child2; parent = &child2; } return parent; } 当我说它不起作用我的意思是,它编译但是当我这样做时我得到一个分段错误: Parent* parent = foo(user_input); parent->some_child_function(); // segmentation error here 我确定这是一个关于我没有完全理解指针的愚蠢/简单的问题.在阅读了书籍/文章中的所有关于它们之后,我仍然不知道我做错了什么……它可能是一个单行修复? 谢谢 :). 解决方法
您遇到未定义的行为:
Parent* parent; if(user_input == "A") { Child1 child1; // stack-allocated object parent = &child1; } //child1 is destroyed at this point,the pointer is dangling now 你必须使用新的(最好用智能指针): Parent* parent = 0; if(user_input == "A") { parent = new Child1(); } else if(user_input == "B") { parent = new Child2(); } 并且在开头将指针设置为null也是一个好主意,这样如果代码中有错误并且指针未被初始化,则没有带垃圾值的指针. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |