首页 >后端开发 >C++ >为什么多态性不适用于 C 中的指令对象向量?

为什么多态性不适用于 C 中的指令对象向量?

Barbara Streisand
Barbara Streisand原创
2024-11-02 14:41:29648浏览

Why Doesn't Polymorphism Work with a Vector of Instruction Objects in C  ?

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中文网其他相关文章!

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