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