12

我有一个基类和一个派生类,我想更改基函数,同时保持它们是静态的,因为它们应该作为静态传递给其他函数。

我怎样才能做到这一点?

4

7 回答 7

26

ATL 框架通过使基类成为模板,然后让派生类将其类类型作为模板参数传递,从而绕过了无虚拟静态的限制。然后基类可以在需要时调用派生类静态,例如:

template< class DerivedType >
class Base
{
public:
  static void DoSomething() { DerivedType::DoSomethingElse(); }
};

class Derived1 : public Base<Derived1>
{
public:
  static void DoSomethingElse() { ... }
};

class Derived2 : public Base<Derived2>
{
public:
  static void DoSomethingElse() { ... }
};

这被称为Curiously recurring 模板模式,可用于实现静态多态性

于 2011-06-10T21:31:25.923 回答
3

您的意思是您需要一个指向静态函数的指针(例如,作为参数传递给另一个需要指向静态函数的指针的函数),但您需要虚拟访问该函数指针?在这种情况下,使用虚函数来获取函数指针:

typedef void (*function)();
void do_stuff_with_function(function);

struct Base {
    virtual ~Base() {}
    virtual function get_function() = 0;
};

struct Derived : Base {
    function get_function() {return my_function;}
    static void my_function();
};

Derived d;
do_stuff_with_function(d.get_function());
于 2011-06-09T10:27:49.920 回答
2

静态函数不能是虚拟的,因为它们没有访问它们的实例。我相信你可以覆盖它们。

于 2011-06-09T10:12:27.190 回答
1

C++ 中不能有静态虚函数。

于 2011-06-09T10:13:11.107 回答
1

虚函数通常依靠this指针来确定在运行时要调用的函数的类型。

静态成员函数不传递,this因此 C++ 中不允许使用静态虚函数。

于 2011-06-09T10:16:16.863 回答
0

如果我理解你的问题是正确的,那么你可以遵循以下方法,否则忽略..

在基类中有静态函数指针。

在基类中有一个静态函数(您在其中使用该静态函数指针调用该函数)..

在派生类中,将静态函数指针设置为您希望执行的函数定义。(在基类中,您可以将函数指针设置为某个默认函数)。

于 2011-06-09T10:16:41.503 回答
-1

你不能拥有静态虚函数,因为拥有它们没有意义

于 2011-06-09T10:16:03.840 回答