C语言模拟实现C++的多态

多态:

维基百科解释:

计算机程序运行时,相同的消息可能会送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。

百度百科解释:

同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。


首先,要明白多态的 含义,字意思即“多种形态,多种状态”。分为 动态多态静态多态两种;

顾名思义,动态多态既是,在编译时决定,当程序运行时,根据调用关系,决定结果。即在编译时才决定结果。

静态多态 ,不是在编译是时决定。主要是,函数重载,模板,的运用。

重载是根据函数参数的类型,顺序,个数的不同(返回值可同可不同)来实现一个函数名有多种运行结果。模板是根据类型的推演来决定结果(泛型)。

(还有 非参数化多态或译作特设多态,参数化多态 之分,有兴趣也可以去了解一下)


C++中多态,是通过虚函数(virtual关键字修饰的函数)来实现的。

有两个类,A和B,我们让B公共继承A。 此时,我们称A为父类(基类),称B为子类(派生类)。


class A
{
public:
	virtual void Fun() //virtual关键字实现虚拟函数
	{
		printf("A::Fun()\n");
	}


};


class B : public  A  //子类公共继承父类
{


public:
	virtual void Fun()//virtual关键字实现虚拟函数
	{
		printf("B::Fun()\n");
	}
};

此时我们分别创建对象,然后分别用父类的指针指向 父类,和用父类的指针指向子类。


int main()
{
	A a;
	B b;
	A* pa = &a; //父类指针指向父类
	pa->Fun(); //调用父类函数  (打印出“A::Fun()”)

	pa = &b; //父类指针指向子类
	pa->Fun();//调用子类函数 (打印出“B::Fun()”)
)




	system("pause");
	return 0;
}



C语言模拟实现:


typedef void(*FUN)();  //定义一个函数指针(返回值为void,参数为空 的函数)

struct A
{
	FUN  f; //函数指针
};

struct B
{
	A a; //通过在B类中创建A类对象达到继承的目的

};

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

void FunB()
{
	printf("B::Fun()\n");
}




int main()
{
	A a;
	B b;

	a.f = FunA; //父类中的函数指针指向FunA
	b.a.f = FunB;//子类中的函数指针指向FunB

	A* pa = &a;//父类指针指向父类对象
	pa->f();  //调用 父类函数 (FunA)(打印出“A::Fun()”)

	pa = (A*)&b; //父类指针指向子类对象(需强转)
	pa->f();//调用 子类函数(FunB)(打印出“A::Fun()”)


	system("pause");
	return 0;

}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值