C语言模拟实现C++的继承与多态

继承与多态的概念 


 继承:是面向对象最显著的一个特性。继承是指可以使用现有类的所有功能,可以使一个对象直接使用另一个对象的属性方法。 通过继承创建的新类称为“子类”或者“派生类”,被继承的类称为“基类”或者“父类”。
多态:简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。 C++多态性是通过虚函数+继承来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖或者称为重写。

 

       由于C语言中结构体不能包含函数,故只能用函数指针在外面实现,定义一个函数指针来实现对成员函数的继承,在子类中定义一个基类的对象实现对父类的继承。通过定义父类指针指向的对象不同,实现多态。

代码实现C语言模拟继承与多态

#include <iostream>
using namespace std;

//C++中的继承与多态
struct A
{
	virtual void fun()    //C++中的多态:通过虚函数实现
	{
		cout << "A:fun()" << endl;
	}

	int a;
};
struct B :public A         //C++中的继承:B类公有继承A类
{
	virtual void fun()    //C++中的多态:通过虚函数实现(子类的关键字virtual可加可不加)
	{
		cout << "B:fun()" << endl;
	}

	int b;
};

//C语言模拟C++的继承与多态

typedef void(*FUN)();      //定义一个函数指针来实现对成员函数的继承

struct _A       //父类
{
	FUN _fun;   //由于C语言中结构体不能包含函数,故只能用函数指针在外面实现

	int _a;
};

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

void _fA()       //父类的同名函数
{
	printf("_A:_fun()\n");
}
void _fB()       //子类的同名函数
{
	printf("_B:_fun()\n");
}


void Test()
{
	//测试C++中的继承与多态
	A a;    //定义一个父类对象a
	B b;    //定义一个子类对象b

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


	//C语言模拟继承与多态的测试
	_A _a;    //定义一个父类对象_a
	_B _b;    //定义一个子类对象_b
	_a._fun = _fA;        //父类的对象调用父类的同名函数
	_b._a_._fun = _fB;    //子类的对象调用子类的同名函数

	_A* p2 = &_a;   //定义一个父类指针指向父类的对象
	p2->_fun();     //调用父类的同名函数
	p2 = (_A*)&_b;  //让父类指针指向子类的对象,由于类型不匹配所以要进行强转
	p2->_fun();     //调用子类的同名函数
}
int main()
{
	Test();
}

猜你喜欢

转载自blog.csdn.net/qq_38936579/article/details/81670803