首页  >  文章  >  后端开发  >  对象切片会影响 C 向量中的多态性吗?

对象切片会影响 C 向量中的多态性吗?

Patricia Arquette
Patricia Arquette原创
2024-11-02 05:50:02760浏览

Does Object Slicing Affect Polymorphism in C   Vectors?

C 中的向量和多态性

问题:

考虑以下 C 代码片段:

<code class="cpp">class Instruction {
public:
    virtual void execute() {}
};

class Add: public Instruction {
private:
    int a;
    int b;
    int c;
public:
    Add(int x, int y, int z) { a=x; b=y; c=z; }
    void execute() { a = b + c;  }
};</code>

创建指令引用向量,并通过推回其解除引用的值来将 Add 对象添加到向量中:

<code class="cpp">vector<Instruction> v;
Instruction* i = new Add(1,2,3);
v.push_back(*i);</code>

在另一个类中,检索向量的最后一个元素,并将调用execute方法:

<code class="cpp">Instruction ins = v.back();
ins.execute();</code>

问题:

execute方法会保留其Add类型,代码会正确执行吗?

答案:

不,不会。

向量存储指令引用的副本,而不是引用本身。这意味着当 Add 对象被推回向量时,会生成引用的副本。

此外,new 运算符用于为 Add 对象分配内存。但是,由于对象未被删除,因此会发生内存泄漏。

要正确实现此场景,应该使用指令*向量或 std::reference_wrapper>:

<code class="cpp">vector<Instruction*> ins;</code>

<code class="cpp">vector< std::reference_wrapper<Instruction> > ins;</code>

附加说明:

此问题中描述的行为称为对象切片。

以上是对象切片会影响 C 向量中的多态性吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn