我有一個抽象基類和模板派生類。派生對象可以由派生對象的前一個實例構造,比如說一個整數。到目前爲止,我們有C++:我怎樣才能避免static_cast?
struct base {
/* ...pure virtual functions here... */
virtual ~base() = default;
/* NO DATA */
};
template <class D>
struct derived : base {
derived() = default;
derived(int x, const derived& previous) {
/* to construct I need access to previous.data_ */
}
/* ...overriden virtual functions here... */
~derived() = default;
D data_;
};
請注意,派生類的構造函數需要訪問previous
派生對象的data_
成員。現在我想創建一個函數,它將通過輸入一個整數和前一個實例derived<D>
構造類型爲derived<D>
的對象,並返回指向base
的指針。問題是,既然 用戶將base
類指針來工作,該功能應該 是這樣的:
template <class D>
std::shared_ptr<base> getNext(int x, std::shared_ptr<base> current) {
return std::make_shared<derived<D>>(x, *current); /* ERROR */
}
這一點,因爲你可能已經猜到,創建一個編譯錯誤,說是沒有已知的轉換從base
到derived<D>
。我知道我可以使用的一件事是static_cast<derived<D>&>(*current)
,因爲底層對象的類型始終爲derived<D>
,但理想情況下,我希望儘可能避免任何強制轉換。 任何想法如何克服這個問題>?提前致謝!
爲什麼不使用複製構造函數? –
@John Smith:派生的構造函數並不是簡單地複製前一個對象。它意味着使用在前一個對象中找到的數據來構建它自己的數據。 – linuxfever
@HeywoodFloyd:我認爲這不重要。問題由getNext的輸入參數創建,而不是其返回類型。 – linuxfever