12

我有一个基类和派生的一个,我想改变基本功能,同时保持它们静态,因为它们应该被传递给静态的其他功能。在c + +静态虚函数

我该怎么做?

+1

给出一个具体的,最小的和完整的例子,说明你正在努力实现的目标(不是你想要实现的目标),我们可以考虑如何做到这一点。 – 2011-06-09 10:23:24

回答

2

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

+0

我知道我不能同时使用静态和虚拟,但我必须做那样的事情, – fank 2011-06-09 10:19:32

+0

没有办法做到这一点。或者使用函数指针技巧(我强烈建议)或者移除静态约束。如果使用静态方法创建工厂,请在工厂模式中完成(http://programmerjoe.com/2007/03/18/the-abstract-factory-pattern-in-c/) – 2011-06-09 10:22:37

1

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

+1

请详细说明您的响应。 – emdog4 2013-05-09 17:59:57

-1

您不能拥有静态虚拟函数,因为将它们设置为没有意义。

+7

实际上,它可以是有意义的:它就像任何其他虚拟函数一样,实现根据类的派生类型进行更改。只是你没有一个实例。 [德尔福](http://docwiki.embarcadero.com/RADStudio/en/Methods#Ordinary_Class_Methods),例如,允许它并且它们可以是相当有用的。 – 2011-06-10 02:23:46

1

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

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

0

如果我理解乌尔题正确,则U可以按照下面的方法,否则忽略..

在基类的静态函数指针。

在基类

具有静态函数(式中,u通过使用静态函数指针调用函数)..

在派生类

设置静态函数poiter到功能认定中û希望执行..(在基类中,你可以将函数指针设置为某个默认函数)。

+0

我做了这样的事 我在基类中做了一个静态函数和一个虚拟函数,静态在派生类中调用虚拟函数之后调用虚拟函数,但现在问题是虚拟不进行派生类,所以它不改变 – fank 2011-06-09 10:23:40

+0

@frank嗨,我不是要你有一个虚拟功能...我想你有一个静态函数指针,并为该变量设置...你从我的子类调用....在你的主要静态函数中,你只需使用该函数指针调用该函数即可。 – Nik 2011-06-09 10:28:35

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()); 
22

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,其可以被用于实现静态多态性

+0

这个设计正是我所需要的,但有一个问题。当你声明'class Derived1'时,你如何使用'Base '?我的意思是,这导致我错误:'错误:期望一个类型,得到'Derived1''和'错误:类型/值不匹配...'。 – 2014-02-02 15:41:33

+0

尝试将'typename'更改为'class'。并阅读:[奇怪的循环模板模式](http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)。 – 2014-02-02 16:43:05

+0

不错的一个!我不知道那个设计。现在正在工作,非常感谢。我已经+1了你的答案。 – 2014-02-02 17:16:21