我有一個類似的基類(但下面不編譯):從基類INITIALISE派生類
struct Base {
virtual void foo()=0;
virtual void init()
{
using Derived = typename std::remove_reference<decltype(*this)>::type;
*this = Derived(); // does not compile as Base is an abstract class
}
};
Base
有很多派生類的,什麼我想要做的就是讓所有的派生類有這init()
函數繼承自Base
並初始化自己(通過調用它們的構造函數)。如果他們願意,也可以讓他們覆蓋init()
。
問題:
我知道這不會編譯。如果我的基地不是抽象類,它會起作用嗎?我不知道
this
指針會被解釋爲派生對象指針嗎?如何實現我想要什麼?
-------------------------------編輯---------- ----------------------------
澄清一點, init()
函數實際上是在做重置。它將每個派生對象重置爲默認狀態。我希望它在Base類中具有這樣的默認行爲,並且如果派生類需要一些不同的reset(),它們可以自由覆蓋它。
這聽起來不像一個好設計。 init函數引入了一個可能的故障點。爲什麼不使用在創建對象時總會觸發的構造函數? – NathanOliver
@james我同意@NathanOliver。如果您自動獲得派生類構造,但仍然允許通過基類指針/引用進行多態,我不明白爲什麼需要'init'。 – VermillionAzure
你能展示一個用例嗎?這感覺就像一個[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。如果你放棄這個錯誤的方法,完成你真正想要的東西可能會更容易。 – StoryTeller