C++][基础知识 5] 虚函数
五 虚函数
VC++中的虚函数主要用来实现程序运行的多态性。所谓多态性是指发出同样的消息(如函数的调用)被不同类型的对象接受时导致不同的行为。利用多态性,用户只需发送一般形式的消息,而将所有的实现留给接受消息的对象。对象根据所接受到的消息而做出相应的操作。
多态性是面向对象程序设计的重要特征之一。它与前面讲过的封装性和继承性构成了面向对象程序设计的三大特征。这三大特性是相互关联的。封装性是基础,继承性是关键,多态性是补充。
VC++中的多态可以分为两种,一种是编译时的多态性,一种是运行时的多态性。编译时的多态性主要是通过函数的重载和运算符的重载来实现,它在程序运行之前(编译时)就能够确定其实现的方法。运行时的多态性则要等到程序运行时才能确定程序的具体执行情况,它主要通过虚函数来实现。
?虚函数的定义及使用
如果将函数定义为虚函数,则表示函数的具体实现是不确定的,相同的调用形式要根据运行时不同的对象来确定其实现方式。它与函数的重载不同,函数的重载根据其调用形式(函数的参数)就能够确定其实现方式。
在类中,如果在某一函数的前面加上关键字”virtual”,则表示将该函数说明为虚函数。虚函数一定是类的成员函数,其多态性要通过类的继承关系来实现。如果将类中的函数说明为虚函数,则该类的派生类中相同原型的函数(同名,且参数类型,顺序以及个数都相同)均具有虚特性而不管是否有关键子”virtual”修饰。例如:
#include<iostream.h>class A{public:virtual void fun() //A行{cout<<"类A中的函数\n";}};class B:public A{public:void fun(){cout<<"类B中的函数\n";}};void main(){A a1,*p;B b1;p=&a1; p->fun(); //B行p=&b1;p->fun(); //C行}
#include<iostream.h>class A{protected:int a;public:A(int x){a=x;}virtual void fun(int)=0; //A行};class B:public A{int b;public:B(int x,int y):A(y){b=x;}void fun(int x) //B行{cout<<a+x<<'\n';cout<<b+x<<'\n';}};void main(){A *p; //C行B b1(2,6);p=&b1;p->fun(1); //D行}
#include<iostream.h>class A{int a,b;public:int sum(int x,int y){return (x+y);}};class B:public A{public:int sum(int x,int y){return (x*y);}};void main(){A a1,*p;B b1;p=&a1;cout<<p->sum(3,2)<<'\n';p=&b1;cout<<p->sum(3,2)<<'\n';cout<<a1.sum(3,2)<<'\n';cout<<b1.sum(3,2)<<'\n';}
#include<iostream.h>class A{int a,b;public:virtual int sum(int x,int y){return (x+y);}};class B:public A{public:int sum(int x,int y){return (x*y);}};void main(){A a1,*p;B b1;p=&a1;cout<<p->sum(3,2)<<'\n';p=&b1;cout<<p->sum(3,2)<<'\n';cout<<a1.sum(3,2)<<'\n';cout<<b1.sum(3,2)<<'\n';}