用C语言模拟实现c++的继承与多态特性

一、我们知道,C语言是一种面向过程的编程语言,而C++是一款在它的语法基础上改进的面向对象的编程语言
(1)面向过程与面向对象的区别:
①从设计方法角度看:
▶面向过程程序设计方法是用函数(即算法过程)对数据进行操作,但又将函数与其操作的数据分离开来。
▶面向对象程序设计方法是将对象的属性数据和对属性数据的操作封装在一起,作为一个整体来处理。
②从维护角度看:
▶面向过程程序设计以过程为中心,难于维护。
▶面向对象程序设计以对象的属性数据为中心,数据相对功能而言,有较强的稳定性,因此更易于维护。
二、继承与多态的概念
① 继承:继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性(数据成员)和行为(成员函数),并能扩展新的能力,已有类被称为父类/基类,新增加的类被称作子类/派生类。
②多态:子类对父类的虚函数进行重写,并且用父类的指针或引用分别指向或者引用父类的对象和子类的对象,则调用其相应的重写虚函数,从而实现一种接口,多种方法的多态;
三、代码实现:
(1)c++继承和多态

#include 
using namespace std;
class A
{
public:
    virtual void fun()//基类函数声明为虚函数
    {
        cout<<"A fun()"<public:
    int _a;
};

class B:public A//B类公有继承A类
{
public:
    virtual void fun()//函数重写,此时基类函数可以声明为虚函数,也可以不声明
    {
        cout<<"B fun()"<public:
    int _b;
};


int main()
{
    A a;//创建父类对象
    B b;//创建子类对象
    A*  p;//定义一个父类指针
    p=&a;//让父类指针指向父类对象
    p->fun();//调用父类的同名函数
    p=&b;//让父类指针指向子类对象
    p->fun();//调用子类的同名函数

    return 0;
}

运行结果:
用C语言模拟实现c++的继承与多态特性_第1张图片

(2)C语言实现c++的继承与多态

#include
using namespace std;
//定义一个函数指针类型;该指针指向一个函数参数形参为空,返回值为void的函数,这个函数类型名字叫FUN;
typedef void (*FUN)();

void Afun()//定义一个函数形参为空,返回值为void的函数
{
    printf("Afun()\n");
}
void Bfun()//定义一个函数形参为空,返回值为void的函数
{
    printf("Bfun()\n");
}
struct A//父类
{
    FUN _fun;//定义一个函数指针类型变量 _fun,指向一个函数,相当于c++类中的成员函数;
    int _a;
};
struct B//子类
{
     A  _a;//B类中有A类的成员,相当于B继承A类
    int _b;
};

int main()
{
    A  a;//父类对象
    B  b;//子类对象
    a._fun=Afun;//父类对象的函数指针指向Afun
    b._a._fun=Bfun;//子类对象的函数指针指向Bfun
    A* p;//定义一个父类的指针
    p=&a;//父类指针指向父类对象
    p->_fun();//父类指针调用自己的同名函数
    p=(A*)&b;//父类指针指向子类对象(由于C类型不一样,所以要对B的对象地址进行强制类型转换)
    p->_fun();//子类指针调用自己的同名函数
    return 0;
}

运行结果:
用C语言模拟实现c++的继承与多态特性_第2张图片

用C语言模拟实现c++的继承与多态特性_第3张图片

四、知识回忆:

typedef用法:

①用法一:typedef 函数指针类型的用法:

typedef int (*MYFUN)(int, int);
这个例子定义了一个函数指针类型, 该类型叫MYFUN,定义的函数指针是指向 形参是两个int , 返回一个int 的函数;
▶在分析这种形式的定义的时候可以用下面的方法:
先去掉typedef 和别名, 剩下的就是原变量的类型.
去掉typedef和MYFUN以后就剩:
int (*)(int, int) //函数指针,指向 形参是两个int , 返回一个int 的 函数

**②用法二:
typedef给变量类型定义一个别名.**


typedef struct{
int a;
int b;
}MY_TYPE;
这里把一个未命名结构直接取了一个叫MY_TYPE的别名, 这样如果你想定义结构的实例的时候就可以这样:
MY_TYPE tmp;

▶typedef 原变量类型 别名

你可能感兴趣的:(C++)