CRTP - 如何从派生类调用方法的基类实现?

时间:2014-12-29 20:42:14

标签: c++ templates crtp

我目前正在使用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();
    }
};

2 个答案:

答案 0 :(得分:1)

我见过的首选方法是使用它:

ConsoleApplication::ShowApplicationStartupMsg();

这很好,因为你很清楚你正在尝试做什么,以及被调用的方法来自哪个父类(如果你不是父类本身就是派生类,则特别有用)。

答案 1 :(得分:0)

ConsoleApplication < PortMonitorConsoleApplication >::ShowApplicationStartupMsg();

使用基类的全名。

请注意,这个&gt; ShowApplicationStartupMsg()不会调用您的基础,它会再次调用您自己的函数。

__超级不是标准(并且不应该成为一个,因为它有多个基础的模棱两可)。

使用ConsoleApplication ::并不是完全标准的(虽然我认为GCC接受它),因为你不能从ConsoleApplication本身继承它,只是它的一个特定实例。