我有一个带有虚方法的抽象基类。在派生类中,实现了此方法。但是,我希望派生类中的函数作为静态方法,以便能够在不实例化该类的对象的情况下调用该函数。
class Base
{
virtual double Foo(double rParam) const;
};
class Derived1 : public Base
{
static double Foo(double rParam);
};
class Derived2 : public Base
{
static double Foo(double rParam);
};
本质上,Derived1和Derived2提供静态函数的不同实现(不依赖于对象数据),但我希望这些函数是虚函数,以便能够在基类的其他函数中调用这些函数。我现在看到的唯一解决方案是在派生类中实现两个成员函数,一个是来自基类的虚函数,另一个是(具有不同的名称)是静态函数。为了防止源代码加倍,虚函数可以直接调用静态函数(可以内联)。还有其他解决方案吗?
class Derived : public Base
{
double Foo(double rParam)const
{
return FooStatic(rParam);
}
inline static double FooStatic(double rParam);
};
答案 0 :(得分:0)
我认为你所拥有的FooStatic
方法是最好的方法,在坚持良好的OO实践方面。从本质上讲,您的非静态Foo
覆盖就像函数指针一样工作到静态版本中。
(强调“类似工作”:你实际上不能直接使用函数指针,因为Foo
的覆盖必须在调用this
之前抛弃对FooStatic
的引用。 )
答案 1 :(得分:0)
将虚方法设为静态是没有意义的。虚拟意味着您可以根据对象的类型选择要运行的实现。在静态上下文中,您没有对象。
编辑:虽然第一个例子将编译,但它不会按照您的预期执行。静态方法不会覆盖基本实现,而是隐藏它,这意味着永远不会调用静态方法而不是基类的静态方法。第二个例子没问题,我看不出任何问题。