6
A
回答
3
是。您可以使用純粹的抽象類,並使用模板類來封裝「實現」抽象類的類型,以擴展抽象類。這裏有一個準系統的例子:
#include <iostream>
// Interface type used in function signatures.
class Iface {
public:
virtual int method() const = 0;
};
// Template wrapper for types implementing Iface
template <typename T>
class IfaceT: public Iface {
public:
explicit IfaceT(T const t):_t(t) {}
virtual int method() const { return _t.method(); }
private:
T const _t;
};
// Type implementing Iface
class Impl {
public:
Impl(int x): _x(x) {}
int method() const { return _x; }
private:
int _x;
};
// Method accepting Iface parameter
void printIface(Iface const &i) {
std::cout << i.method() << std::endl;
}
int main() {
printIface(IfaceT<Impl>(5));
}
0
我想一些粗略的等價可能是可行的GObject。
3
是的,當然。
事實上,處理在運行界面的代碼是用C寫 http://code.google.com/p/go/source/browse/src/pkg/runtime/iface.c
0
我對C++進行了刺探。我結束了一些有用的東西,但是是一個宏觀馬戲團:https://github.com/wkaras/c-plus-plus-misc/tree/master/IFACE。一個接口是兩個指針,一個是對象數據成員,另一個是虛擬表的等價物(指向調用成員函數的thunk函數的指針結構)。這些表格(不幸的是)在運行時生成。從接口到子接口的轉換需要查找unordered_map,因此平均而言,時間複雜度爲O(1)。與將派生類指針/引用轉換爲基類相比,O(1)最差。
這不是很實用,但它確實表明接口可以(乾淨地)添加到C++中,而且工作量相對較少。有些情況下接口比基於繼承的面向對象更好,並且儘量保持C++的小巧,牛完全脫離了穀倉。
相關問題
- 1. 是否可以在Go中執行call-cc?
- 2. 是否可以在IE8中模擬Object.getOwnPropertyNames
- 3. 是否可以模擬Activator.GetObject()?
- 4. 是否可以模擬iframe?
- 5. 是否可以在IMAPI界面中選擇cd寫入模式?
- 6. 是否可以在模擬中設置模擬?
- 7. 是否可以在UIWebView上模擬UITouch?
- 8. 是否可以使用Android界面(xml)來模擬錨(html)事件?
- 9. Go lang界面
- 10. Go的界面可以被認爲是一個指針?
- 11. 是否可以在Visual Studio 2008中模擬虛擬目錄?
- 12. 是否可以在iPhone模擬器上模擬電話?
- 13. 如何使用反射來實現或模擬Go界面?
- 14. Mockito可以模擬包級別可視化界面嗎?
- 15. 是否可以在Xcode6中模擬iphone6 +的縮放模式?
- 16. 是否可以 - 模擬此方法?
- 17. 是否可以模擬文件列表?
- 18. 是否可以模擬FTDI USB設備?
- 19. Go中的排序界面
- 20. 是否可以在IFRAME中顯示Google Analytics報告界面?
- 21. 是否可以在添加/刪除界面中使用操作?
- 22. 是否可以在Django中創建多個管理界面?
- 23. 是否可以在emacs cc-mode中使C++自動啓動?
- 24. 在Flash中模擬下載CC
- 25. 是否可以在iPhone模擬器或設備中模擬4G網絡?
- 26. 是否可以在Xcode或設備中模擬低GPS精度?
- 27. 是否可以在Ruby中創建(或模擬)關鍵字?
- 28. 是否可以在模擬器中啓用懸停?
- 29. 是否可以在NodeJS中模擬鍵盤/鼠標事件?
- 30. 是否可以在Angular2 +中模擬一個Attribute Directive?
從某種意義上說,這就是模板所做的。如果使用模板化參數調用函數,則可以傳入任何滿足您如何使用模板所定義的要求的對象。 – Bill