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;
}