首頁  >  文章  >  後端開發  >  物件切片會影響 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>

考慮以下C 程式碼片段:

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

建立指令引用向量,並透過推回其解除引用的值來將Add 物件加入向量:

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

在另一個類別中,檢索向量的最後一個元素,並將呼叫execute方法:

問題:

execute方法會保留其Add類型,程式碼會正確執行嗎?

答:

不,不會。

向量儲存指令引用的副本,而不是引用本身。這表示當 Add 物件被推迴向量時,會產生引用的副本。

此外,new 運算子用於為 Add 物件分配記憶體。但是,由於物件未被刪除,因此會發生記憶體洩漏。
<code class="cpp">vector<Instruction*> ins;</code>

要正確實現此場景,應該使用指令*向量或std::reference_wrapper>:

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

附加說明:

此問題中所描述的行為稱為物件切片。

以上是物件切片會影響 C 向量中的多態性嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn