前言
多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
多态
多态作为c++语言中最重要的一环,他的地位相当于c语言中的指针,他是面向对象编程的核心,他是一种面向未来的编程
因为继承的兼容性的影响,我们不能很好的使用我们想使用同名的类成员函数,而总是去使用父类的成员函数,导致代码的复用性下降,而多态的出现很好的解决了这个问题,他抛出了接口。很好的解决了这个问题
编译器的做法不是我们期望的
根据实际的对象类型来判断重写函数的调用
如果父类指针指向的是父类对象则调用父类中定义的函数
如果父类指针指向的是子类对象则调用子类中定义的重写函数
多态的可以使调用的语句表现出不同的表现形态
多态的使用
通过virtual声明的函数来实现多态
------实例
class dorm
{
public:
dorm (int a=0)
{
this->num=a;
}
virtual int class_1 () //多态的声明
{
return num*7;
}
private:
int num;
};
class unv
{
public:
int all ()
{
return 24;
}
};
class dorm_1 : public dorm
{
public:
dorm_1 (int a)
{
this->num=a;
}
virtual int class_1 () //在字函数中可以不写,也能实现功能,但是为了
代码的可读性,建议去写
{
return num*10;
}
private:
int num;
};
class my_4220 : public dorm
{
virtual int class_1 ()
{
return 800;
}
private:
int num;
};
void func (dorm& p,unv& a)
{
int va=p.class_1()*a.all();
cout <<"全校人数为 "<<va<<endl;
}
int main(int argc, char *argv[])
{
// dorm_1 a(6); 两个派生类使用相同的函数,得到结果却不相同
my_4220 a;
unv b;
func(a,b);
return 0;
}
多态成立的三个条件
- 要有继承
- 要有函数重写,c虚函数
- 要有父类指针指向子类对象
多态的理论基础
01静态联编和动态联编
1、联编是指一个程序模块、代码之间互相关联的过程。
2、静态联编(static binding),是程序的匹配、连接在编译阶段实现,也称为早期匹配。
重载函数使用静态联编。
3、动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编(迟绑定)。
补充
1、C++与C相同,是静态编译型语言
2、在编译时,编译器自动根据指针的类型判断指向的是一个什么样的对象;所以编译器认为父类指针指向的是父类对象。
3、由于程序没有运行,所以不可能知道父类指针指向的具体是父类对象还是子类对象
从程序安全的角度,编译器假设父类指针只指向父类对象,因此编译的结果为调用父类的成员函数。这种特性就是静态联编。