多态

多态简单说就是多种形态。

多态可以分为静态多态和动态多态。静态多态是在编译期间完成的,编译器会根据函数实参的类型,可以推断出想要调用的那个函数,要是没有能够调用的函数,那么编译就会出错。比如:

#include<iostream>
using namespace std;
int ADD(int i, int j)
{
	return i + j;
}
double ADD(double i, double j)
{
	return i + j;
}
int main()
{
	cout << ADD(1, 2) << endl;
	cout << ADD(1.2, 1.3) << endl;
}
运行结果为:

动态多态:在程序执行期间判断所引用对象的实际类型,根据其实际类型调用相应的方法。而动态绑定的条件是:1,必须是虚函数。2,通过基类类型的引用或者指针调用虚函数。

首先了解几个基本概念的区分:

重载:a)是在同在作用域

            b)函数名相同,参数不同

            c)返回值可以不同

重写:a)不在同一作用域(分别在基类和派生类)

             b)函数名相同,参数相同,返回值相同

             c)基类必须有virtual关键字

             d)访问修饰符可以不同

重定义:a)在不同的作用域中

                b)函数名相同

                d)在基类和派生类中只要不构成重写就是重定义

现在来看一个例子:

#include<iostream>
using namespace std;
class Base
{
public:
	virtual void Funtest1(int _iTest)
	{
		cout << "Base::Funtest1" << endl;
	}
	void Funtest2(int _itest)
	{
		cout << "Base::Funtest2" << endl;
	}
	virtual void Funtest3(int _iTest)
	{
		cout << "Base::Funtest3" << endl;
	}
	virtual void Funtest4(int _iTest)
	{
		cout << "Base::Funtest4" << endl;
	}
};
class Derived :public Base
{
	virtual void Funtest1(int _iTest)
	{
		cout << "Derived::Funtest1" << endl;
	}
	virtual void Funtest2(int _iTest)
	{
		cout << "Derived::Funtest2" << endl;
	}
    void Funtest3(int _iTest)
	{
		cout << "Derived::Funtest3" << endl;
	}
	virtual void Funtest4(int _iTest1 ,int _iTest2)
	{
		cout << "Derived::Funtest4" << endl;
	}
};
int main()
{
	Base* pBaes = new Derived;//如果构成重写就会调用派生类的对象
	pBaes->Funtest1(0);//因为构成重写的条件,所以调用派生类的函数
	pBaes->Funtest2(0);//调用基类
	pBaes->Funtest3(0);//调用派生类
	pBaes->Funtest4(0);//调用基类
	//pBaes->Funtest4(0,0);//不能通过编译,因为在基类中只有一个参数
	return 0;
}

如果在基类中是个虚函数,那么在派生类中写不写virtual都默认为是虚函数,例如,Funtset3。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值