可以使用派生类,就像使用静态类函数一样?

时间:2017-01-01 10:33:50

标签: c++ oop

我正在开发一个项目,我希望它可以指定使用几类方法/算法/函数中的哪一类。每个方法“class”提供类似的功能,并且可以与其他类互换。

我试图用一个基础抽象类来实现它,方法“classes”作为派生类:

class Method {
public:
    virtual int function1(int) = 0;
    virtual int function2(int, int) = 0;
};

class Method1 : public Method {
public:
    int function1(int a) {
        return a * 2;
    }

    int function2(int a, int b) {
        return a + b;
    }
};

class Method2 : public Method {
public:
    int function1(int a) {
        return a / 2;
    }

    int function2(int a, int b) {
        return a - b;
    }
};

void useMethod(int a, int b, Method& m) {
    int result1 = m.function1(a);
    int result2 = m.function2(a, b);

    /* Do something with the results here */
}

int main() {
    // Doesn't work, "type name is not allowed"
    useMethod(1, 2, Method1);
    useMethod(1, 2, Method2);

    // Works, but seems unnecessary and less elegant
    Method1 x;
    useMethod(1, 2, x);
    Method2 y;
    useMethod(1, 2, y);

    return 0;
}

问题是我似乎无法弄清楚如何允许使用Method1Method2而不创建它们的实例 - 这在我看来是不必要的,因为它们都只是提供功能相同。 有没有办法让派生类排序为“静态”,这样可以在没有实例的情况下使用它们?

1 个答案:

答案 0 :(得分:4)

你可以做到:

useMethod(1, 2, Method1());
useMethod(1, 2, Method2());

否则,您不能使用static virtual方法。你可以用模板实现类似的东西:

template<typename T>
void useMethod(int a, int b) 
{
    int result1 = T().function1(a); //or if you made the methods static then T::method1(a)
    int result2 = T().function2(a, b); //ditto

    /* Do something with the results here */
}

用法:

useMethod<Method1>(1, 2);

然后您不需要基本抽象类,也不需要虚拟方法。如代码注释中所述,您可以将方法设置为静态,然后不需要类的实例。