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>
这里,Instruction 类定义了一个虚拟执行方法,该方法在添加类。
现在,让我们创建一个包含指令对象的向量:
<code class="cpp">vector<Instruction> v; Instruction* i = new Add(1,2,3); v.push_back(*i);</code>
在另一个方法中,我们检索向量的最后一个元素并调用其执行方法:
<code class="cpp">Instruction ins = v.back(); ins.execute();</code>
会起作用吗?
不,不会。向量存储值,而不是引用。这意味着Add对象会被复制到向量中,导致对象切片。
如何修复
为了保持多态性,我们需要使用向量指针:
<code class="cpp">vector<Instruction*> v; v.push_back(i);</code>
或者,我们可以使用 std::reference_wrapper
<code class="cpp">vector<std::reference_wrapper<Instruction>> v; v.push_back(i);</code>
这确保对象不会被切片,从而允许我们保留它们的动态类型并正确调用虚函数。
以上是为什么多态性不适用于 C 中的指令对象向量?的详细内容。更多信息请关注PHP中文网其他相关文章!