【问题标题】:implement a virtual method from the base class as derived in static从静态派生的基类实现虚拟方法
【发布时间】:2013-09-02 02:32:28
【问题描述】:

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

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

【问题讨论】:

  • 如果Foo被标记为virtual,则表示它依赖于对象的运行时类型,所以不能不与类的实例耦合。
  • 情况有点棘手。作为一个简化的例子,假设我们有一个需要函数 foo 的基类。在 Derived1 中,这是一个线性函数,所以 foo(x)=x 和在 Derived2 中 foo(x)=x^2,所以这两个函数都不依赖于对象数据。但是,我希望该函数在基类中是虚拟的,以便能够从基类中的另一个函数调用此函数。派生类中还有其他数据成员,但是,这对于当前使用静态/虚拟方法的示例并不重要。

标签: c++ inheritance static-methods virtual-functions


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    编辑:虽然第一个示例可以编译,但它不会按照您的预期进行。静态方法不会覆盖基实现,而是隐藏它,这意味着永远不会调用静态方法而不是基类。第二个例子很好,我看不出有什么问题。

    【讨论】:

    • 我认为您还没有完全阅读 OP 的问题。 OP 想要做的是使这些静态版本对基类虚拟可用,同时仍然让静态版本静态可用,以便外部代码可以在不创建对象实例的情况下使用它。
    • 这正是问题所在,对于派生类,该方法是静态的,但是我希望能够从基类调用它作为虚函数,因为 derived1 和 derived2 有不同的实现功能。
    猜你喜欢
    • 2012-05-24
    • 2011-03-13
    • 2023-03-23
    • 1970-01-01
    • 2015-04-08
    • 2020-10-21
    • 2014-04-27
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多