我有一个基类和一个派生类,我想更改基本函数,同时保持它们是静态的,因为它们应该作为静态传递给其他函数。
我该怎么做?
答案 0 :(得分:24)
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 template pattern,可用于实现静态多态。
答案 1 :(得分: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());
答案 2 :(得分:2)
静态函数不能是虚拟的,因为它们没有访问它们的实例。我确实相信你可以覆盖它们。
答案 3 :(得分:1)
你不能在C ++中拥有静态虚函数。
答案 4 :(得分:1)
虚函数通常依赖this
指针来确定在运行时调用的函数类型。
静态成员函数不传递this
,因此C ++中不允许使用静态虚函数。
答案 5 :(得分:0)
如果我理解你的问题是正确的,那么你可以遵循以下方法,否则忽略..
在基类中有静态函数指针。
基类中的有一个静态函数(在其中你通过使用那个静态函数指针来调用函数)..
在派生类中将静态函数poiter设置为函数defination你希望执行..(在基类中你可以将函数指针设置为某个默认函数)。
答案 6 :(得分:-1)
你不能拥有静态虚拟功能,因为拥有它们没有意义。