我目前正在使用C ++模板搞乱CRTP模式。在摆弄visual studio时,我发现了几种方法/方法,派生类可以调用函数的基类实现。下面是我正在使用的代码,还有3个注释掉的行显示了如何从派生类调用函数的基类实现。使用一种方法比另一种方法有益处吗?有什么不同吗?什么是最常用的方法?
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();
}
};
答案 0 :(得分:1)
我见过的首选方法是使用它:
ConsoleApplication::ShowApplicationStartupMsg();
这很好,因为你很清楚你正在尝试做什么,以及被调用的方法来自哪个父类(如果你不是父类本身就是派生类,则特别有用)。
答案 1 :(得分:0)
ConsoleApplication < PortMonitorConsoleApplication >::ShowApplicationStartupMsg();
使用基类的全名。
请注意,这个&gt; ShowApplicationStartupMsg()不会调用您的基础,它会再次调用您自己的函数。
__超级不是标准(并且不应该成为一个,因为它有多个基础的模棱两可)。
使用ConsoleApplication ::并不是完全标准的(虽然我认为GCC接受它),因为你不能从ConsoleApplication本身继承它,只是它的一个特定实例。