我在C++中有一個class
對象和一個struct
對象。 struct
負責使用CSV文件中的數據填充class
。 所以這個擴展是當我創建一個派生類時,我還創建了一個派生結構,它可以正確填充這個相似但不同的派生類。被上傳到基類的C++對象;不能調用派生的方法
struct BaseStruct {
double var = 0;
vector<double> vectorA;
virtual BaseClass^ generateClass() {return gcnew BaseClass(this->var, this->vectorA);}
};
struct DerivedStruct : BaseStruct {
vector<double> vectorB;
virtual BaseClass^ generateClass() override {return gcnew ChildClass(this->var, this->vectorA, this->vectorB);}
};
該結構然後由另一個文件讀取對象使用,並返回多態結構給用戶;
BaseStruct FileReader::GetSetupStruct(String^ parameter)
{
BaseStruct retval; //Struct to be passed back
retval = (boolLogicCondition) ? BaseStruct() : DerivedStruct(); //Should return correct type of struct
return retval;
}
然而,當我嘗試使用下面的代碼,通過參照將其作爲基類,它會自動回覆到一個基類(失去附加vectorB
屬性)和它的多晶型性質。
我懷疑它失去了它的派生的地位,因爲一)它在局部變量窗口類型,當我從三元運營商B返回改變)setupStruct.generateClass()
永遠只執行基類的方法
BaseStruct setupStruct = FileReader::GetSetupStruct(parameter);//Returns struct - type should depend on parameters
Signal^ mySignal = setupStruct.generateClass(); //Should run either derived or base method
如何使用這兩個結構並在運行時生成正確的類型,但保持多態性的本質,而不會將其轉換爲基本類型?
請問您能解釋一下您的代碼選擇嗎?我知道我的代碼會將結果切片回基類,但是我不確定代碼是如何實現的,以及您如何將'auto'關鍵字和'make_unique'方法一起使用? (甚至可以在線查看一些示例!)非常感謝! – davidhood2
好吧,對於'GetSetStruct'函數'auto'只是現代(我的首選)聲明語法,就像花括號約定是我的首選約定,而不是你使用的約定。所以你可以用你喜歡的編寫代碼的方式來替換所有的東西。 C++ 14的'make_unique()'大致等價於'unique_ptr (new T)',但它更短,並且在參數列表中包含兩個或多個'new'表達式的情況下更安全。在最後一個例子中,我可以說'a'的類型是'int',然後'int * p'而不是'auto * p'。也許更清楚? –