回答
靜態函數不能是虛擬的,因爲它們沒有通過它們訪問的實例。我相信你可以覆蓋他們。
我知道我不能同時使用靜態和虛擬,但我必須做那樣的事情, – fank 2011-06-09 10:19:32
沒有辦法做到這一點。或者使用函數指針技巧(我強烈建議)或者移除靜態約束。如果使用靜態方法創建工廠,請在工廠模式中完成(http://programmerjoe.com/2007/03/18/the-abstract-factory-pattern-in-c/) – 2011-06-09 10:22:37
您不能擁有靜態虛擬函數,因爲將它們設置爲沒有意義。
實際上,它可以是有意義的:它就像任何其他虛擬函數一樣,實現根據類的派生類型進行更改。只是你沒有一個實例。 [德爾福](http://docwiki.embarcadero.com/RADStudio/en/Methods#Ordinary_Class_Methods),例如,允許它並且它們可以是相當有用的。 – 2011-06-10 02:23:46
虛擬函數通常依賴於this
指針來確定要在運行時調用的函數的類型。
靜態成員函數不通過this
,因此C++中不允許使用靜態虛函數。
如果我理解烏爾題正確,則U可以按照下面的方法,否則忽略..
在基類的靜態函數指針。
在基類具有靜態函數(式中,u通過使用靜態函數指針調用函數)..
在派生類設置靜態函數poiter到功能認定中û希望執行..(在基類中,你可以將函數指針設置爲某個默認函數)。
你的意思是,你需要一個指向靜態函數(例如,以作爲參數傳遞給需要一個指向靜態功能的另一功能),但你需要虛擬訪問函數指針?在這種情況下,使用一個虛擬函數來獲取函數指針:
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());
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,其可以被用於實現靜態多態性。
這個設計正是我所需要的,但有一個問題。當你聲明'class Derived1'時,你如何使用'Base
嘗試將'typename'更改爲'class'。並閱讀:[奇怪的循環模板模式](http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)。 – 2014-02-02 16:43:05
不錯的一個!我不知道那個設計。現在正在工作,非常感謝。我已經+1了你的答案。 – 2014-02-02 17:16:21
- 1. 靜態函數調用非靜態函數在C++
- 2. C++多態/純虛函數
- 3. 帶靜態類的虛函數?
- 4. 「......」一個C靜態函數
- 5. c中的靜態函數
- 6. C++靜態函數和
- 7. C#從靜態函數
- 8. C++靜態函數複製
- 9. 靜態函數靜態函數
- 10. extern在C++中的靜態函數
- 11. 在C++靜態庫中導出函數
- 12. 函數在C++中的靜態綁定
- 13. 在C++中調用靜態函數
- 14. 在Python中訪問靜態C函數
- 15. 靜態線程函數訪問非靜態類成員在C++
- 16. 在C++中更新靜態函數中的非靜態成員
- 17. 在C++中使用靜態和靜態函數的錯誤
- 18. 靜態函數
- 19. 通過函數指針靜態調用虛函數
- 20. 靜態成員函數調用的語義虛函數時
- 21. C鏈接C++靜態函數
- 22. 虛函數(C++)
- 23. 虛函數C++
- 24. 靜態函數
- 25. C++函數返回靜態數組
- 26. 如何從另一個靜態函數調用靜態函數
- 27. 靜態函數中的靜態變量?
- 28. C#替代虛擬靜態方法和靜態子類
- 29. Objective C靜態構造函數與動態構造函數
- 30. C#虛擬(或抽象)靜態方法
給出一個具體的,最小的和完整的例子,說明你正在努力實現的目標(不是你想要實現的目標),我們可以考慮如何做到這一點。 – 2011-06-09 10:23:24