問題:
考慮以下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中文網其他相關文章!