在C 中判斷某個類是否實現了某個介面

2021-09-25 23:44:15 字數 1556 閱讀 8705

有時我們需要判斷某個類是否實現了某個介面(inte***ce),比如在使用反射機制(reflection)來查詢特定型別的時候。

簡單來說,可以使用type.isassignablefrom方法:

1

2

typeof(ifoo).isassignablefrom(bar.gettype());

typeof(ifoo).isassignablefrom(typeof(barclass));

從字面意思可以看出,isassignablefrom表示barclass型別能否賦值給ifoo介面,所以它返回true的條件就是barclass直接或間接實現了ifoo介面。type型別中還有乙個方法是issubclassof,它只能用於判斷類的繼承關係,比如

1

typeof(fooclass).issubclassof(typeof(barclass)) == true

表示fooclass是繼承自barclass。

當然isassignablefrom也可以用來判斷繼承關係。

於是,對於以下的**:

1

2

3

inte***ce i

class a : i

class b : a

issubclassof和isassignablefrom的返回值為:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

typeof(a).isassignablefrom(typeof(i)); // false

typeof(a).issubclassof(typeof(i)); // false

typeof(i).isassignablefrom(typeof(a)); // true

typeof(i).isassignablefrom(typeof(b)); // true

typeof(b).issubclassof(typeof(i)); // false

typeof(a).isassignablefrom(typeof(a)); // true

typeof(a).issubclassof(typeof(a)); // false

typeof(a).isassignablefrom(typeof(b)); // true

typeof(a).issubclassof(typeof(b)); // false

typeof(b).isassignablefrom(typeof(a)); // false

typeof(b).issubclassof(typeof(a)); // true

c 11判斷某個類是否具有某個函式成員

by 鳥哥 c 11判斷某個類是否含有某個成員函式和變數 include include include template typename t struct has member f1 template typename t struct has member aa struct class1 v...

時間範圍比較,判斷某個時間是否在某個時間段內工具類

時間格式化 判斷某個時間是否在某個時間段內 param date 待比較的時間 param format 時間格式,eg hh mm param starttimestr 時間範圍的開始時間,eg 06 00 param endtimestr 時間範圍的結束時間,eg 22 00 public st...

C 判斷某個類是否有某個成員函式,如果有則呼叫

有兩個sdk版本,a版本類base有setscalingmode函式,b版本類base無setscalingmode函式,為了同時相容兩個sdk版本,共用一套 常見的是通過巨集隔離,但版本眾多時管理起來會很麻煩,若可先判斷是否含有該函式,若有則呼叫,c 11新增特性解決了這一問題 偽 如果支援set...