我有一个棘手的情况。它的简化形式是这样的

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;  }
};

然后在一个类上我做类似...
void some_method()
{
    vector<Instruction> v;
    Instruction* i = new Add(1,2,3)
    v.push_back(*i);
}

在另一个类中...
void some_other_method()
{
    Instruction ins = v.back();
    ins.execute();
}

他们以某种方式共享此指令 vector 。我关心的是我执行“执行”功能的部分。能行吗它会保留其添​​加类型吗?

最佳答案

不,不会。

vector<Instruction> ins;

存储值,而不是引用。这意味着无论您如何使用,那里的指令对象都将在将来的某个时刻被复制。

此外,由于您要使用new进行分配,因此上述代码会泄漏该对象。如果要正确执行此操作,则必须执行
vector<Instruction*> ins

或者,更好的是:
vector< std::reference_wrapper<Instruction> > ins

我喜欢这个this blog post来解释reference_wrapper
此行为称为object slicing.

09-07 04:16