c語(yǔ)言實(shí)現(xiàn)多態(tài)的方法是什么

小億
116
2024-06-11 14:07:43

在C語(yǔ)言中,實(shí)現(xiàn)多態(tài)的方法通常是通過(guò)函數(shù)指針和結(jié)構(gòu)體來(lái)實(shí)現(xiàn)。通過(guò)定義一個(gè)包含函數(shù)指針的結(jié)構(gòu)體,并且在不同的子類中實(shí)現(xiàn)相同的函數(shù)指針,就可以實(shí)現(xiàn)多態(tài)性。

具體實(shí)現(xiàn)步驟如下:

  1. 定義一個(gè)基類結(jié)構(gòu)體,包含一個(gè)函數(shù)指針作為成員變量,表示虛函數(shù)。
  2. 定義多個(gè)子類結(jié)構(gòu)體,每個(gè)子類都包含相同的虛函數(shù),并且實(shí)現(xiàn)自己的具體函數(shù)邏輯。
  3. 在子類的構(gòu)造函數(shù)中,將子類的函數(shù)指針指向子類自身的函數(shù)。
  4. 在使用時(shí),通過(guò)基類指針調(diào)用虛函數(shù),實(shí)現(xiàn)多態(tài)效果。

示例代碼如下所示:

#include <stdio.h>

// 基類結(jié)構(gòu)體
typedef struct {
    void (*func)(void);
} BaseClass;

// 子類1結(jié)構(gòu)體
typedef struct {
    BaseClass base;
} SubClass1;

void func1() {
    printf("This is func1.\n");
}

// 子類2結(jié)構(gòu)體
typedef struct {
    BaseClass base;
} SubClass2;

void func2() {
    printf("This is func2.\n");
}

int main() {
    SubClass1 sub1;
    SubClass2 sub2;

    // 初始化子類1
    sub1.base.func = func1;
    
    // 初始化子類2
    sub2.base.func = func2;

    // 多態(tài)調(diào)用
    BaseClass* ptr1 = (BaseClass*)&sub1;
    ptr1->func();

    BaseClass* ptr2 = (BaseClass*)&sub2;
    ptr2->func();

    return 0;
}

以上代碼通過(guò)定義基類結(jié)構(gòu)體BaseClass和兩個(gè)子類結(jié)構(gòu)體SubClass1和SubClass2實(shí)現(xiàn)多態(tài)性。函數(shù)指針func作為虛函數(shù),分別在子類中實(shí)現(xiàn)具體的函數(shù)邏輯。在main函數(shù)中,通過(guò)基類指針調(diào)用虛函數(shù),實(shí)現(xiàn)了多態(tài)的效果。

0