C模拟CPP的方法重写(override)和多态

发布时间 2023-09-21 14:39:46作者: Guanjie255

1. 所谓override,就是子类中重新实现了父类中的某一方法(子类和父类的同一个方法的方法体不同)

2. 所谓多态,最显著的一个特点就是父类指针指向不同的子类对象时,运行同一个方法会有不同的行为

3. C语言模拟继承时,父类对象必须是子类对象的第一个成员

4. 理解了C的父类结构体指针子类结构体变量,就不难理解Cpp/Java中的父类引用指向子类对象了!

#include <stdio.h>

void fatherInfo() {
  printf("I am father\n");
}

void sonInfo() {
  printf("I am son\n");
}

void daughterInfo() {
  printf("I am daughter\n");
}

//父结构体
struct father
{
    // function pointer
    void (*printInfo)();
    int f1;
};

struct son
{
    //子结构体里定义一个父结构体变量,必须放在子结构体里的第一位
    struct father fs;
    int s1;

};

struct daughter {
  //子结构体里定义一个父结构体变量,必须放在子结构体里的第一位
  struct father fs;
  int d1;
  
};

int main(void)
{
    // 分别定义子类结构体变量s和d
    struct son s;
    struct daughter d;

    // 定义一个指针数组,数组的每一个元素都是父类指针,但是指向的对象时子类对象
    /* 这种定义方式会有警告但是可以正常运行。
    出现警告是因为指针类型不匹配,需要使用强制类型转换.
    struct father* arr[] = {(struct father*)&s, (struct father*)&d}; 
    */
    struct father* arr[] = {&s, &d};  

    // 初始化子类对象s
    s.fs.printInfo = sonInfo;  // 子类override父类的方法
    s.fs.f1 = 10;
    s.s1 = 20;
    // 初始化子类对象d
    d.fs.printInfo = daughterInfo;  // 子类override父类的方法
    d.fs.f1 = 100;
    d.d1 = 200;
    
    // 多态测试
    arr[0]->printInfo();
    arr[1]->printInfo();

    return 0;
}

5.pythontutor运行结果