1

我有一个带有虚拟方法的抽象基类。在派生类中,实现了这个方法。但是,我希望派生类中的函数作为静态方法,以便能够在不实例化该类的对象的情况下调用该函数。

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);
};
4

2 回答 2

0

我确实认为,FooStatic就坚持良好的 OO 实践而言,您采用的方法是最好的方法。本质上,您的非静态Foo覆盖就像函数指针一样工作到您的静态版本中。

(强调“类似工作”:您实际上不能直接使用函数指针,因为您的覆盖必须在调用之前Foo丢弃对的引用。)thisFooStatic

于 2013-08-29T15:13:00.253 回答
0

将虚拟方法设为静态是没有意义的。虚拟意味着您根据对象的类型选择要运行的实现。在静态上下文中,您没有对象。

编辑:虽然第一个示例将编译,但它不会做你期望它做的事情。静态方法不会覆盖基实现,而是隐藏它,这意味着永远不会调用静态方法而不是基类。第二个例子很好,我看不出有什么问题。

于 2013-08-29T15:18:08.890 回答