问题:
考虑以下 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中文网其他相关文章!