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