2017-01-09 47 views
1

我在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 

如何使用這兩個結構並在運行時生成正確的類型,但保持多態性的本質,而不會將其轉換爲基本類型?

回答

1

在此代碼:

BaseStruct retval; //Struct to be passed back 
retval = (boolLogicCondition) ? BaseStruct() : DerivedStruct(); 
  • 的選擇操作者產生一個,而不是參考。

  • BaseStruct類型的retval的賦值,無論如何將結果切片爲BaseStruct


重新

我如何使用這兩個結構中,並在運行時生成正確的類型,但保持多態性性質而不會被upcasted爲基本類型?

&hellip;獲得多態行爲的一種方法是返回一個指針,而不是通過值返回到工廠實例,:

auto FileReader::GetSetupStruct(String^ parameter) 
    -> std::unique_ptr<BaseStruct> 
{ 
    if(boolLogicCondition) 
    { 
     return std::make_unique<BaseStruct>(); 
    } 
    else 
    { 
     return std::make_unique<DerivedStruct>(); 
    } 
} 

免責聲明:即興代碼甚至沒有在由編譯器掃了一眼。


在其他上下文中,選擇操作符可以生成一個引用。例如,有兩個變量a和相同類型的b,你可以做

auto* p = &(condition? a : b); 

但在上面的子表達式的代碼可供選擇,都是右值表達式,或者更非正式,「價值」表達式您無法將內置的&地址運算符應用於。

+0

請問您能解釋一下您的代碼選擇嗎?我知道我的代碼會將結果切片回基類,但是我不確定代碼是如何實現的,以及您如何將'auto'關鍵字和'make_unique'方法一起使用? (甚至可以在線查看一些示例!)非常感謝! – davidhood2

+1

好吧,對於'GetSetStruct'函數'auto'只是現代(我的首選)聲明語法,就像花括號約定是我的首選約定,而不是你使用的約定。所以你可以用你喜歡的編寫代碼的方式來替換所有的東西。 C++ 14的'make_unique ()'大致等價於'unique_ptr (new T)',但它更短,並且在參數列表中包含兩個或多個'new'表達式的情況下更安全。在最後一個例子中,我可以說'a'的類型是'int',然後'int * p'而不是'auto * p'。也許更清楚? –

相關問題