如何在派生类

时间:2015-12-11 11:38:17

标签: c++ inheritance static

我在覆盖基本类的静态方法方面存在一些问题,但整个问题非常复杂且过长(游戏引擎中资源管理的普遍化),所以这里是一个简化版本:< / p>

template<class T>
class base
{
    static void bar()
    { printf("bar"); }
public:
    static void foo()
    { bar(); }
};

class derived : public base<int>
{
    static void bar()
    { printf("baz"); }
};

int main() { derived::foo(); }

上面的代码输出&#34; bar&#34;在我的情况下,我想让它输出&#34; baz&#34;。我该怎么办呢?似乎无论我尝试什么,base :: foo()总是调用base :: bar()。我的设计可能有问题。我从未遇到过这个问题 - 我该如何解决?

1 个答案:

答案 0 :(得分:20)

使用简单的类继承无法实现您想要做的事情;方法不能同时为NSLocationWhenInUseUsageDescription NSLocationAlwaysUsageDescription in my info.plist static

您需要virtual方法才能在没有对象(实例)的情况下调用函数;并且您需要staticbar,以便virtualbar<int>::foo() 实例调用derived::bar()时调用derived

这两个特征是相互排斥的。但奇怪的递归模板模式(CRTP)可能是一个解决方案:

#include <iostream>

template<class T>
struct base
{
    static void foo()
    {
        T::bar();
    }
};

struct derived : public base<derived>
{
    static void bar()
    {
        std::cout << "derived" << std::endl;
    }
};

int main()
{
    derived::foo();
}

Live example