亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在C中模擬OO風格的多態?

如何在C中模擬OO風格的多態?

C
翻閱古今 2019-07-30 11:00:58
如何在C中模擬OO風格的多態?有沒有辦法在C編程語言中編寫類似OO的代碼?也可以看看:你能用C編寫面向對象的代碼嗎?C中的面向對象通過搜索“[c] oo”找到。
查看完整描述

3 回答

?
慕田峪4524236

TA貢獻1875條經驗 獲得超5個贊

第一個C ++編譯器(“C with classes”)實際上會生成C代碼,所以這絕對可行。


基本上,你的基類是一個結構; 派生結構必須在第一個位置包含基本結構,因此指向“derived”結構的指針也將是指向基本結構的有效指針。


typedef struct {

   data member_x;

} base;


typedef struct {

   struct base;

   data member_y;

} derived;


void function_on_base(struct base * a); // here I can pass both pointers to derived and to base


void function_on_derived(struct derived * b); // here I must pass a pointer to the derived class

這些函數可以作為函數指針的結構的一部分,因此像p-> call(p)這樣的語法變得可能,但你仍然必須顯式地將指向結構的指針傳遞給函數本身。


查看完整回答
反對 回復 2019-07-30
?
慕婉清6462132

TA貢獻1804條經驗 獲得超2個贊

C ++離C不遠。

類是具有指向名為VTable的函數指針表的隱藏指針的結構。Vtable本身是靜態的。當類型指向具有相同結構的Vtables但指針指向其他實現時,您將獲得多態性。

建議將調用邏輯封裝在以struct為參數的函數中,以避免代碼混亂。

您還應該在函數中封裝結構實例化和初始化(這相當于C ++構造函數)和刪除(C ++中的析構函數)。無論如何這些都是很好的做法。

typedef struct{
   int (*SomeFunction)(TheClass* this, int i);
   void (*OtherFunction)(TheClass* this, char* c);} VTable;typedef struct{
   VTable* pVTable;
   int member;} TheClass;

要調用方法:

int CallSomeFunction(TheClass* this, int i){
  (this->pVTable->SomeFunction)(this, i);}


查看完整回答
反對 回復 2019-07-30
  • 3 回答
  • 0 關注
  • 600 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號