首頁 > 後端開發 > C++ > 主體

物件切片會影響 C 向量中的多態性嗎?

Patricia Arquette
發布: 2024-11-02 05:50:02
原創
759 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!