2012-01-23 35 views
6

在Go中,如果該類型具有接口定義的所有方法,則可以將其分配給該接口變量而不顯式繼承它。是否可以在C/C++中模擬Go界面?

是否可以在C/C++中模擬此功能?

+0

從某種意義上說,這就是模板所做的。如果使用模板化參數調用函數,則可以傳入任何滿足您如何使用模板所定義的要求的對象。 – Bill

回答

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

0

我對C++進行了刺探。我結束了一些有用的東西,但是是一個宏觀馬戲團:https://github.com/wkaras/c-plus-plus-misc/tree/master/IFACE。一個接口是兩個指針,一個是對象數據成員,另一個是虛擬表的等價物(指向調用成員函數的thunk函數的指針結構)。這些表格(不幸的是)在運行時生成。從接口到子接口的轉換需要查找unordered_map,因此平均而言,時間複雜度爲O(1)。與將派生類指針/引用轉換爲基類相比,O(1)最差。

這不是很實用,但它確實表明接口可以(乾淨地)添加到C++中,而且工作量相對較少。有些情況下接口比基於繼承的面向對象更好,並且儘量保持C++的小巧,牛完全脫離了穀倉。

相關問題