C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 将类更改为其子类大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图让一个类的每个实例(这里名为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中)移动数据.在这种情况下,您已将子类对象中的数据复制到基类对象.这复制了空子集的空子集.您观察到的问题称为“切片”.

您可能想要的是包含可以更改的@L_772_8@指针的成员. virtual为您提供@L_772_8@指针,但无法更改.尝试std :: tr1 :: function,boost :: function或C 11 std :: function.

或者,如果您真的想要去虚拟路线,请使用Target *指针.最好使用智能指针类,例如unique_ptr<目标> (再次是Boost / TR1 / C 11)或std :: auto_ptr<目标> (老式的C 03).您也可以使用New和delete自己完成,但是这样的代码并不能真正起作用,并且只适用于一些教育修补.

大佬总结

以上是大佬教程为你收集整理的c – 将类更改为其子类全部内容,希望文章能够帮你解决c – 将类更改为其子类所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。