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

一、我们知道,C语言是一种面向过程的编程语言,而C++是一款在它的语法基础上改进的面向对象的编程语言

(1)面向过程与面向对象的区别:

①从设计方法角度看: 
▶面向过程程序设计方法是用函数(即算法过程)对数据进行操作,但又将函数与其操作的数据分离开来。 
▶面向对象程序设计方法是将对象的属性数据和对属性数据的操作封装在一起,作为一个整体来处理。 
②从维护角度看: 
▶面向过程程序设计以过程为中心,难于维护。 
▶面向对象程序设计以对象的属性数据为中心,数据相对功能而言,有较强的稳定性,因此更易于维护。 

二、继承与多态的概念

① 继承:继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性(数据成员)和行为(成员函数),并能扩展新的能力,已有类被称为父类/基类,新增加的类被称作子类/派生类。 
②多态:子类对父类的虚函数进行重写,并且用父类的指针或引用分别指向或者引用父类的对象和子类的对象,则调用其相应的重写虚函数,从而实现一种接口,多种方法的多态; 

三、代码实现:

(1)c++继承和多态

class A {
public:
    virtual void Fun() {
        cout << "A::Fun()" << endl;
    } // 基类中定义一个虚函数
    int _a;
};

// B公有继承A
class B :public A {
public:
    virtual void Fun() {
        cout << "B::Fun()" << endl;
    } // 在派生类中重写虚函数
    int _b;
};

int main() {
    A a; //创建基类对象
    B b; //创建子类对象
    A* p; //定义一个基类指针
    p = &a; //基类指针指向基类对象
    p->Fun(); //通过指针调用虚函数
    p = &b; //基类指针指向派生类对象
    p->Fun(); //通过指针调用子类的虚函数
    return 0;
}

运行结果
这里写图片描述

(2)C语言实现继承和多态

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

void AFun() {
    printf("A::Fun()\n");
}

void BFun() {
    printf("B::Fun()\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; // 父类指针指向子类
    p->_fun(); // 通过指针调用子类的同名函数
    return 0;
}

运行结果:
这里写图片描述

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