关键点:
1.虚函数为多态具体表现,在原来定义函数的基础上,在最左侧加上关键字virtual(virtual void f())。
2.定义纯虚函数的类,不能被初始化,类似于java中interface(virtual void f()=0)。
3.虚函数的作用是实现了函数与对象的后捆绑。
4.虚函数的实现原理:在程序编译期间,会为每个拥有virtual函数的类创建一个vtable表,编译器将用于存放虚函数地址。并且编译器会为拥有虚拟函数的类创建一个
指针vpoint,用于指向该vtable。通过基类指针做虚函数调用时(也就是做多态调用时),编译器静态地插入取得这个vpoint,并在vatble表中查找函数地址的代码,这样就能调用正确的函数使晚捆绑发生。
代码例子:
class A{
public:
virtual void f(){
cout<<"A.f()"<<endl;
}
}
class B:public A{
public:
void f(){
cout<<"B.f()"<<endl;
}
}
class C{
public:
virtual void f() =0;//纯虚函数定义
}
void function(A &a){
a.f();
}
int main(){
B b;
function(b);//向上映射,(向上转型)
// C c //错误,拥有纯虚函数的类不能被实例化,只能被继承
return 1;
}
打印结果将会为:
B.f();