面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)有三个重要特征:封装性、继承性和多态性。
多态性
不同的对象接收到同样的指令(调用同一函数)会产生不一样的结果,谓之多态性。
举个简单的例子,【动物类】派生出【猫类】和【狗类】。【猫类】对象和【狗类】对象调用同一函数【叫】时,前者产生“喵~~”,而后者产生“汪汪汪”。这就是多态性,让程序生动而有魅力
。
函数重载与静态联编
多个函数使用同一函数名,但这些同名函数具有不同的原型(形参表不同),这就是函数重载。
因为重载函数的形参表是不同的,因此系统在编译过程中就可以确定该函数与程序中的哪一段函数相联系,即在编译时就已确定函数调用语句对应的函数体代码,故称为静态联编。
函数超载与动态联编
多个函数,有完全相同的函数原型,却可以不同的函数体,这种现象就叫函数超载。
由于超载函数允许不同的函数具有相同的函数原型,因此在编译阶段系统无法判断此次调用应执行哪一段函数代码。只有在运行过程中执行到该函数调用时,才能临时判断应执行哪一段函数代码,故称为动态联编。
为了实现虚函数与动态联编,我们需要用到一个概念,那就是虚函数。
虚函数
在基类中将某一非静态成员函数的属性说明为virtual,则称该函数为虚函数
格式
virtual <返回类型><函数名>(<参数表>){
// 函数体
}
说明方法
基类中某函数被说明为虚函数,其派生类中也列出与该函数原型相同但函数体可以不同的函数成员。
示例
class Animal{
virtual void sound(){ sound.. }
};
class Cat{
virtual void sound(){ Meow~~~ }
};
class Dog{
virtual void sound(){ Bark!!! }
};
class Bird{
virtual void sound(){ Tweet^^^ }
};
注意
1.如果不准备在基类的虚函数中做任何的事情,可用如下格式将该函数说明为纯虚函数。(详见 纯虚函数与抽象基类)
virtual <函数原型>=0;
2.在派生类说明中关键字“virtual”可以缺省,它们自动定义为虚函数,但在基类中不可缺省。
3.构造函数不能说明为虚函数,但析构函数可以说明为虚函数
使用方法
1.直接通过派生类对象调用它们各自实现的虚函数
Cat cat; cat.sound();
Dog dog; dog.sound();
Bird bird; bird.sound();
2.使用指向基类的指针,然后再通过将派生类对象的地址赋给基类指针变量,从而通过指针间接调用派生类各自实现的虚函数。
Cat cat;
Dog dog;
Bird bird;
Animal *pa;
pa = &cat; pa->sound();
pa = &dog; pa->sound();
pa = &bird; pa->sound();
虚函数的好处
1.使程序简单易读,减少限定符的使用。
2.使程序模块间独立性加强,隐藏函数细节,提高程序封装性。
3.增加程序易维护性,新增派生类更容易。