继承和多态是C++的特性,它C语言没有这个特性。
C++的三大特性:继承,多态,封装。
继承:分为公有(public)继承,私有(private)继承,保护(protected)继承。
用struct来模拟实现,因为struct在C和C++中都能可以使用,在C中称为结构体在C++中称为类,但他们的原理是一样的,又因为struct的限定符默认是公有的,在C中没有限定符这个概念,所以用C语言只能实现成公有继承。
//实现继承
//子类可以调用父类的成员函数和成员变量
//因为结构体中无函数,故用函数指针来实现
typedef void (*ss)();
struct A
{
ss s;
int a;
};
struct B
{
struct A _a;
int b;
};
void f1()
{
printf("father de f1()...\n");
}
void fun1()
{
struct A _a;
struct B _b;
_b._a.a =1;
_b._a.s =f1;
_b.b=2;
printf("child--->father:%d\n",_b._a.a);
_b._a .s(); //调用fun函数
}
多态:
//实现多态
//多态--》子类对父类的虚函数进行重写(函数名,参数,返回值都相同,协变除外),
//父类的指针/引用调用重写的虚函数时,当指向父类的对象就是父类的虚函数,
//当指向子类调用的,就是子类的虚函数
typedef void (*Fun)(); //定义了一个Fun类型的函数指针
//因为C的结构体中不能包含函数,故用函数指针来实现
struct C
{
Fun fun; //为Fun类型定义一个变量
int a;
int b;
};
struct D
{
struct C c;
};
void PrintfC()
{
printf("C is father....\n");
}
void PrintfD()
{
printf("D is child......\n");
}
void fun2()
{
struct C cc;
struct D dd;
struct C* c1;
cc.fun =PrintfC;
dd.c .fun=PrintfD;
c1=&cc;
c1->fun(); //调用父类虚函数
c1=(struct C*)ⅆ
c1->fun(); //调用子类的虚函数
}