我目前正在使用C++模板搞亂CRTP模式。在用visual studio擺弄時,我發現了派生類可以調用函數的基類實現的幾種方式/方法。下面是我正在使用的代碼,還有3條註釋掉的行顯示瞭如何從派生類調用函數的基類實現。使用一種方法比另一種方法有好處嗎?有什麼區別嗎?什麼是最常用的方法?CRTP - 如何從派生類調用基類的實現方法?
template<typename T>
struct ConsoleApplication
{
ConsoleApplication()
{
auto that = reinterpret_cast<T*>(this);
that->ShowApplicationStartupMsg();
}
void ShowApplicationStartupMsg()
{
}
};
struct PortMonitorConsoleApplication : ConsoleApplication <PortMonitorConsoleApplication>
{
void ShowApplicationStartupMsg()
{
// __super::ShowApplicationStartupMsg();
// this->ShowApplicationStartupMsg();
// ConsoleApplication::ShowApplicationStartupMsg();
}
};
爲什麼在基類和派生歸入都需要'ShowApplicationStartupMsg()'?如果派生除了調用基礎之外什麼也不做,你應該在派生類中省略版本。 – willj
這三個中只有一個是調用隱藏基方法的有效方法。 – hvd
您的基類構造函數具有未定義的行爲。基礎正在初始化,但派生實例的成員和其成員都沒有被初始化。您正在調用尚未完全初始化的對象。你也不應該在這裏使用'reinterpret_cast',而應該使用'static_cast'。 –