加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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自己完成,但是这样的代码并不能真正起作用,并且只适用于一些教育修补.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读