c – 将类更改为其子类
发布时间:2020-12-16 09:38:36 所属栏目:百科 来源:网络整理
导读:我试图让一个类的每个实例(这里名为Caller)都有另一个类的实例(Target).关键是第二类有很多孩子,我需要能够让Caller类随意切换.我尝试了几种方法,但没有一种方法给了我任何理想的结果.当前代码: class Target{public: virtual void do_something() { log_me
我试图让一个类的每个实例(这里名为Caller)都有另一个类的实例(Target).关键是第二类有很多孩子,我需要能够让Caller类随意切换.我尝试了几种方法,但没有一种方法给了我任何理想的结果.当前代码:
class Target { public: virtual void do_something() { log_message("NO!"); } }; class TargetChild : public Target { public: virtual void do_something() { log_message("YES!"); } }; class Caller { private: Target target; public: void call_target() { target.do_something(); } void set_target(Target set_target) { target = set_target; } }; int main( int argc,const char* argv[] ) { TargetChild targetChild; Caller caller; caller.call_target(); caller.set_target(targetChild); caller.call_target(); } 日志文件中的结果是“NO!YES!”但它写了NO!两次.我真的不明白它有什么问题. 解决方法
您无法在C中更改对象的类型.您只能创建,销毁,复制和(在C 11中)移动数据.在这种情况下,您已将子类对象中的数据复制到基类对象.这复制了空子集的空子集.您观察到的问题称为“切片”.
您可能想要的是包含可以更改的函数指针的成员. virtual为您提供函数指针,但无法更改.尝试std :: tr1 :: function,boost :: function或C 11 std :: function. 或者,如果您真的想要去虚拟路线,请使用Target *指针.最好使用智能指针类,例如unique_ptr<目标> (再次是Boost / TR1 / C 11)或std :: auto_ptr<目标> (老式的C 03).您也可以使用new和delete自己完成,但是这样的代码并不能真正起作用,并且只适用于一些教育修补. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |