多态是指使用相同的函数名来访问函数不同的实现方法,即“一种接口,多种方法”,用相同的形式访问一组通用的运算,每个运算可能对应的行为不同。C++支持编译时多态和运行时多态,运算符重载和函数重载就是编译时多态,而派生类和虚函数实现运行时多态。运行时多态的基础是基类指针,基类指针可以指向任何派生类对象。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、虚拟主机、营销软件、网站建设、古县网站维护、网站推广。
虚函数与基类指针在一起时会有奇妙的现象。
1.虚函数是为了实现多态而存在的
请看以下程序:
#include
using namespace std;
class F
{
public:
void novir()
{
cout "father novir"
}
virtual void vir()
{
cout "father vir"
}
};
class S : public F
{
public:
void novir()
{
cout "son novir"
}
void vir()
{
cout "son vir"
}
};
int main()
{
F f;
S s;
s.novir();// 子类起作用,输出为 son novir
s.vir();//子类起作用,输出为son vir
f.novir();//父类起作用(因为其本身在这里与子类没有关系),输出father novir
f.vir();// 父类起作用(因为其本身在这里与子类没有关系),输出father vir
F *ff;
ff = s;//将一个父类指针指向一个子类对象;子类指针不能指向父类对象
ff-novir();//父类起作用,显示father novir
ff-vir();//子类起作用,虚函数多态的用处,显示 son vir,具体参见下面解释
return 0;
}
输出:
[root@localhost root]# ./vir
son novir
son vir
father novir
father vir
father novir
son vir
例如:父类为 车,子类为汽车
子类指针不能指向父类对象(即将父类对象赋值给子类指针):
因为子类中有些信息父类没有,如果用指针访问的时候很可能访问到父类没有的一些属性及函数,会出错。父类的对象可以有很多,自行车,摩托车,轿车等,如果用一个父类的对象赋给子类汽车的指针,汽车有的属性,例如发动机,父类对象就没有,会产生错误。
父类指针可以指向子类对象(即将子类对象赋值给父类指针):
由于继承的关系,子类对象同样也是父类的对象,例如:汽车有轮子,汽车也属于车,父类车也有轮子,这种情况下,子类对象就成为了父类的一个对象,所以只能操作父类有的属性及函数。对于那些父类没有的属性,必须将父类指针强制转化为子类指针后才可使用。
虚函数的多态体现
我们都知道,程序运行的过程要经过 预处理,编译,运行,链接等步骤。虚函数在程序运行的时候才被绑定,编译的时候不进行相关处理,只有运行的时候才对其进行相关操作。
所以在程序片:
=======================================================
F *ff;
ff = s;//将一个父类指针指向一个子类对象;子类指针不能指向父类对象
ff-novir();//父类起作用,显示father novir
ff-vir();//子类起作用,虚函数多态的用处,显示 son vir
=======================================================
程序在运行时决定调用虚函数的哪个定义,这个决定依赖于基类型指针所指向的对象的类型。通过点运算调用虚函数时,忽略了虚函数的多态性,**只有**使用***基类型指针访问虚函数***,运行时的多态性才得以体现。即C++根据指针指向对象的类型来决定调用虚函数的哪个定义,在这里,指针所指向的类型为子类对象,所以虚函数使用子类的函数。
virtual是虚拟的意思,也就是说那些函数是虚函数。
基类相当于父亲,派生类相当于儿子,儿子可以继承爸爸的东西。所以方法可以重写。
编译的时候就不知道如果调用派生类对象的时候调用哪个函数了
加了virtual可以把函数的绑定推迟到运行时。也就是你运行时绑定函数,根据你的参数调用基类函数还是派生类的函数
虚函数在运行时具有多态性,若某个基类函数声明为虚函数,那么公有派生类将定义与基类虚函数原型相同的函数。(通俗说:基类函数加virtual成为虚函数后,在派生类里将重新定义与基类虚函数原型相同的函数,当用基类指针或基类引用操作派生类对象时,系统将会调用派生类里的同名函数!)
抽象类就是至少包含一个纯虚函数(只声明函数不具体定义功能,在派生类中定义功能)的类是抽象类,抽象类只作为基类派生新类。抽象类作用是更有效发挥多态特性!
参考教材及个人见解,纯手打,仅供参考,满意请采纳一下吧!