C语言实现C++继承和多态

C++中的多态

我们知道的是在C++中会维护一张虚函数表,根据赋值兼容规则,我们知道父类的指针或者引用是可以指向子类对象的。如果一个父类的指针或者引用调用父类的虚函数则该父类的指针会在自己的虚函数表中查找自己的函数地址,如果该父类对象的指针或者引用指向的是子类的对象,而且该子类已经重写了父类的虚函数,则该指针会调用子类的已经重写的虚函数。

//c++中的多态
class Base
{
public:
	virtual void fun()//虚函数实现
	{
		cout << "Base::fun() " << endl;
	}
};

class Derived :public Base
{
public:
	virtual void fun()//虚函数实现,子类中virtual关键字可以没有
	{
		cout << "Derived::fun() " << endl;
	}
};

void Test1()
{
	Base a;//基类对象
	Derived b;//派生类对象

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

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

C语言实现多态

我们知道在C语言中是没有class类这个概念的,但是有struct结构体,我们可以考虑使用struct来模拟;但是在C语言的结构体内部是没有成员函数的,如果实现这个父结构体和子结构体共有的函数呢?我们可以考虑使用函数指针来模拟。但是这样处理存在一个缺陷就是:父子各自的函数指针之间指向的不是类似C++中维护的虚函数表而是一块物理内存,如果模拟的函数过多的话就会不容易维护了。

//C实现动态,用到函数指针
typedef void(*FUN)();//重定义一个函数指针类型
					 
struct Base  
{
	FUN _f;
};

struct Derived
{
	Base _b;//在子类中定义一个基类的对象即可实现对父类的继承
};

void FunBase()
{
	printf("%s\n", "Base::fun()");
}
void FunDerived()
{
	printf("%s\n", "Derived::fun()");
}

void Test2()
{
	Base b;//父类对象
	Derived d;//子类对象

	b._f = FunBase;//父类对象调用父类同名函数
	d._b._f = FunDerived;//子类调用子类的同名函数

	Base *pb = &b;//父类指针指向父类对象
	pb->_f();

	pb = (Base *)&d;//让父类指针指向子类的对象,由于类型不匹配所以要进行强转
	pb->_f();
}

文章参考自:https://blog.csdn.net/wenqiang1208/article/details/76244628

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答您的问题。在C语言中,封装可以通过结构体来实现。结构体中的成员变量可以被定义为私有的,只能通过结构体提供的接口函数来访问。继承可以通过结构体嵌套来实现,子结构体可以继承父结构体中的成员变量和函数指针,并可以添加自己的成员变量和函数指针。多可以通过函数指针来实现,父结构体中的函数指针可以指向不同的子结构体中的同名函数,从而实现。 下面是一个示例代码,演示了如何在C语言实现封装、继承和多的特性: ```c #include <stdio.h> // 父结构体 typedef struct { int x; } Base; // 子结构体 typedef struct { Base base; // 嵌套父结构体 int y; } Derived; // 父结构体的接口函数 void setX(Base *base, int x) { base->x = x; } int getX(Base *base) { return base->x; } // 子结构体的接口函数 void setY(Derived *derived, int y) { derived->y = y; } int getY(Derived *derived) { return derived->y; } // 多的函数 void printX(Base *base) { printf("%d\n", base->x); } int main() { Derived d; setX(&d.base, 1); setY(&d, 2); printf("%d %d\n", getX(&d.base), getY(&d)); printX(&d.base); return 0; } ``` 在上面的示例代码中,我们定义了一个父结构体`Base`和一个子结构体`Derived`。`Derived`结构体嵌套了`Base`结构体,并添加了自己的成员变量`y`。我们也定义了一些接口函数来操作这些成员变量。`printX`函数是一个多的函数,可以接受`Base`结构体的指针作为参数,实现了多的特性。 希望这个示例代码可以帮助您更好地理解如何在C语言实现封装、继承和多的特性。如果还有其他问题,请随时询问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值