我目前正在使用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'。 –