C实现C++面向对象的特性

本文探讨如何在C语言中实现类似C++的面向对象特性,如封装、继承和多态。通过使用结构体和函数指针,我们可以模拟C++中的类和虚函数。示例代码展示了如何创建结构体来封装数据和行为,以及如何通过结构体嵌套实现继承。对于多态,通过函数指针实现动态绑定,但这种方法可能导致不易维护的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


title: C实现C++面向对象的特性
date: 2021-06-20 20:26:37
tags: [C++]


C实现C++面向对象的特性

C++ 实现案例

C++ 中的多态:在 C++ 中会维护一张虚函数表,根据赋值兼容规则,我们知道父类的指针或者引用是可以指向子类对象的。

如果一个父类的指针或者引用调用父类的虚函数则该父类的指针会在自己的虚函数表中查找自己的函数地址,如果该父类对象的指针或者引用指向的是子类的对象,而且该子类已经重写了父类的虚函数,则该指针会调用子类的已经重写的虚函数。

#include <iostream>
using namespace std;
class A
{
public:
    virtual void f()// 虚函数实现
    {
        cout << "Base A::f() " << endl;
    }
};

class B :public A    // 必须为共有继承,否则后面调用不到,class默认为私有继承。
{
public:
    virtual void f()// 虚函数实现,子类中virtual关键字可以没有
    {
        cout << "Derived B::f() " << endl;
    }
};

int main()
{
    A a;//基类对象
    B b;//派生类对象

    A* pa = &a;//父类指针指向父类对象
    pa->f();//调用父类的函数

    pa = &b; //父类指针指向子类对象,多态实现
    pa->f();//调用派生类同名函数

    return 0;
}

输出:

Base A::f()
Derived B::f()

C实现

  • 封装

    C 语言中是没有 class 类这个概念的,但是有 struct 结构体,我们可以考虑使用 struct 来模拟。使用函数指针把属性与方法封装到结构体中。

  • 继承

    结构体嵌套。

  • 多态

    类与子类方法的函数指针不同。

在 C 语言的结构体内部是没有成员函数的,如果实现这个父结构体和子结构体共有的函数呢?

我们可以考虑使用函数指针来模拟。但是这样处理存在一个缺陷就是:父子各自的函数指针之间指向的不是类似 C++ 中维护的虚函数表而是一块物理内存,如果模拟的函数过多的话就会不容易维护了。

模拟多态,必须保持函数指针变量对齐(在内容上完全一致,而且变量对齐上也完全一致)。否则父类指针指向子类对象,导致运行崩溃。

#include <stdio.h>
// 重定义一个函数指针类型
typedef void (*pf) ();
// 父类
typedef struct _A
{
    pf _f;
}A;
// 子类
typedef struct _B
{
    A _b; // 在子类中定义一个基类的对象即可实现对父类的继承。 
}B;
void FunA()
{
    printf("%s\n", "Base A::fun()");
}
void FunB()
{
    printf("%s\n", "Derived B::fun()");
}
int main()
{
    A a;
    B b;

    a._f = FunA;
    b._b._f = FunB;

    A* pa = &a;
    pa->_f();
    pa = (A*)&b;   // 让父类指针指向子类的对象,由于类型不匹配所以要进行强转 
    pa->_f();
    return 0;
}

PDF:链接 密码:h45p

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值