多态的简单理解

多态:

在了解多态之前,我们先来了解一下对象的类型,了解对象类型就是为了更方便了解多态的类型;对象类型可以简单的分为静态类型和动态类型,其中静态类型就是对象声明的类型,在编译时确定的;而动态类型就是对象在目前的类型,是在运行时确定的;

看一下这部分的代码:

class B
{};

class C1:public B
{};

class C2:public B
{};

int main()
{
	C1* pC1 = new C1;
	B* pB = pC1;
	C2* pC2 = new C2;
	pB = pC2;
	return 0;
}
其中pC1的静态类型就是C1*,动态类型也是C1*;pB的静态类型则是B*,动态类型是C1*,在被pC2赋值后此刻的动态类型就是C2*。

下面我们就来了解一下多态:

多态,简单理解就是多种形式或形态的意思,但在c++中有着更加广泛的含义。

在c++中,多态可以被分为两种,分别叫静态多态和动态多态,静态多态,我们较为熟悉的有函数重载和泛型编程(模板),函数重载在这之前已经简单的进行过介绍了,后面我会再写模板的相关内容;而动态多态主要就是虚函数,虚函数我在这里就不详细介绍了,只作一下简单的介绍。

静态多态:

以代码为例:

int Add(int left, int right)
{
	return left + right;
}

float Add(float left, float right)
{
	return left + right;
}

int main()
{
	cout << Add(10, 20) << endl;
	cout << Add(12.3f, 15.6f) << endl;
	return 0;
}

你看,我在其中给了两个函数,编译器会根据函数实参的类型自己判断去调用哪一个函数,如果没找到符合该类型的函数,就会编译错误。这就是静态多态。

动态多态:

就是在程序执行期间判断所用对象的类型,根据这个类型调用相应的方法,这又叫做动态绑定。

而在讲动态多态就得提到虚函数,用virtual关键字修饰类的成员函数,指明该函数为虚函数,派生类再去重新实现,这样编译器将实现动态绑定。

以代码为例:

class B
{
public:
	virtual void Test1(int i)
	{
		cout << "B:Test1()" << endl;
	}
	virtual void Test2(int i)
	{
		cout << "B:Test2()" << endl;
	}
	void Test3(int i)
	{
		cout << "B:Test3()" << endl;
	}
};

class C: public B
{
public:
	virtual void Test1(int i)
	{
		cout << "C:Test1()" << endl;
	}
	void Test2(int i)
	{
		cout << "C:Test2()" << endl;
	}
	virtual void Test3(int i)
	{
		cout << "C:Test3()" << endl;
	}
};

int main()
{
	B* b = new C;
	b->Test1(0);
	b->Test2(0);
	b->Test3(0);
	return 0;
}

可以看到,这个基类类型的指针调用,在派生类重写了基类中的虚函数后,基类类型的指针就会调用派生类中的函数,而其余的则会调用相对应的函数。

注意:动态绑定有两个条件

1、必须是虚函数;

2、必须通过基类类型的指针或引用进行调用。

注:所有代码都是在vs2013下编译的。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值