虚函数
定义: 基类中声明使用了vitual关键字并在派生类中重新定义的成员函数叫做虚函数。
作用:实现了多态的机制,动态联编。
当子类重新定义了父类的虚函数后,当父类的指针指向子类对象的地址时,[即C c; B *pb = &c;] 父类指针根据赋给它的不同子类指针,动态的调用子类的该函数,而不是父类的函数。这样的函数调用发生在运行阶段,而不是发生在编译阶段,称为动态联编。而函数的重载可以认为是多态,只不过是静态的。注意,非虚函数静态联编,效率要比虚函数高,但是不具备动态联编能力。
如果使用了virtual关键字,程序将根据引用或指针指向的对象类型来选择方法,否则使用引用类型或指针类型来选择方法。
#include<iostream>
using namespace std;
class B{
int i;
public:
B(){};
B(int n):i(n){};
virtual void print1();
virtual void print2();
};
void B::print1(){cout<<"call B print1 111 B::i "<<i<<endl;}
void B::print2(){cout<<"call B print2 222 B::i "<<i<<endl;}
class C:public B{
int j;
public:
C();
C(int n):j(n){};
//virtual void print1();
virtual void print2(); //重定义基类方法print2
};
//void C::print1(){cout<<"call C print1 111 C::j "<<j<<endl;}
void C::print2(){cout<<"call C print2 222 C::j "<<j<<endl;}
int main()
{
B b(111);
C c(222);
b.print1(); //call B print1
c.print1(); //call B print1 派生类C继承B类的
b.print2(); //call B print2
c.print2(); //call C print2
B *pb = &b;
B *pc = &c;
pb->print1(); //call B print1
pc->print1(); //call B print1
pb->print2(); //call B print2
pc->print2(); //call C print2
return 0;
}
输出如下:
call B print1 111 B::i 111
call B print1 111 B::i 134515163
call B print2 222 B::i 111
call C print2 222 C::j 222
call B print1 111 B::i 111
call B print1 111 B::i 134515163
call B print2 222 B::i 111
call C print2 222 C::j 222