純C語言簡單模擬C 的虛函式表

2021-12-30 00:11:58 字數 1466 閱讀 1621

多型,面向介面程式設計等設計方法並沒有繫結到任何特定的語言上,使用純c也可以實現簡單的多型概念。下面給出乙個非常簡單粗糙的例子,只為說明概念。父類animal定義

檔案:animal.h

#ifndef animal_h

#define animal_h

/* 方法表, 類似於c++的虛函式表 */

typedef struct vtable vtable;

struct vtable

;typedef struct animal animal;

struct animal;/*

如果不用虛表的話,每個物件都要包含所有的介面函式指標, 而實際上所有同型別物件的這些指標的值是相同的,造成記憶體浪費。

介面函式是和型別一對一的,而不是和物件一對一。

struct animal;*/

#endif子類dog,檔案dog.h

#ifndef dog_h

#define dog_h

#include "animal.h"

typedef struct dog dog;

struct dog

;animal* create_dog();

#endifdog.c

#include

#include

#include "dog.h"

static void dog_eat()

;static void dog_bite()

;/* 虛表是在編譯時確定的 */

static const vtable dog_vtable = ;

animal* create_dog()

return (animal*)pdog;

}另乙個子類cat, 檔案cat.h

#ifndef cat_h

#define cat_h

#include "animal.h"

typedef struct cat cat;

struct cat

;animal* create_cat();

#endifcat.c

#include

#include

#include "animal.h"

#include "cat.h"

static void cat_eat()

;static void cat_bite()

;static const vtable cat_vtable = ;

animal* create_cat()

return (animal*)pcat;

}主檔案 main.c

#include

#include "animal.h"

#include "cat.h"

#include "dog.h"

void showbite(animal* panimal)

void main()

標準C 語言 虛函式表

注意 析構函式可以使用虛函式,但建構函式不可以是虛函式 ios in 以讀許可權開啟檔案,不存在則失敗,存在不清空 ios out 以寫許可權開啟檔案,不存在則建立,存在則清空 ios binary 以二進位制模式進行讀寫 ios ate 開啟時定位到檔案末尾 ios trunc 開啟檔案時清空 f...

C 虛函式表

考慮最簡單的有虛函式的繼承關係 class f class s public f 此時,我們可以定義乙個父類的指標,實際指向乙個子類的物件。呼叫func函式的結果是子類的函式。虛函式在這裡是動態繫結的。f f new s f func 輸出s func 我們知道子類即使不定義虛函式也會繼承該虛函式表...

C 虛函式表

一般來說,對於開發者我們只需要知道虛函式的使用方法,以及虛函式表的存在即可。但面試時往往會遇到更細節的問題,比如讓你實現乙個虛函式機制,雖然不太實用,總歸了解些底層知識也是件好事。但如果有人苦苦相逼一定要拿這個刷人,你就去罵他吧,你才是寫編譯器的,你們全家都是寫編譯器的。唉,我有些失態了.1.虛函式...