虚函数,静态与动态绑定

正好复习到了这部分,整理一下,主要是翻译课件。


虚函数和指针结合使用可以产生最大的效果。

1. 非虚函数是静态绑定的;

2. 虚函数可能(may)是动态绑定的;

3. 一个指针实际上可能指向了衍生类对象,当虚函数被指针调用时,绑定哪个函数取决于被指对象的类,而不是指针的类型;

4. 所以,虚函数根据执行函数的类型(接收者,the receiver) 来绑定。


静态绑定和动态绑定的区别:

1. 动态绑定:只有在程序运行时才能决定调用哪个函数;

2. 静态绑定:编译时就可以决定调用哪个函数;

3. C++中,如果接收者是个指针则虚函数动态绑定(例如:如果f(...)为虚函数,则pointer->f(...)动态绑定);

4. 其他函数都是静态绑定。


虚函数和重载函数的区别:(转自:http://blog.csdn.net/livelylittlefish/article/details/2171515,我觉得这个程序解释的很清楚)

1. 重载函数在类型和参数数量上一定不相同,而重定义的虚函数则要求参数的类型和个数、函数返回类型相同;
2. 虚函数必须是类的成员函数,重载的函数则不一定是这样;
3. 构造函数可以重载,但不能是虚函数,析构函数可以是虚函数。


例1:

                               
#include <iostream.h>
class CBase
{
public:
    
virtual int func(unsigned char ch) {return --ch;}
}
;
class CDerive : public CBase
{
    
int func(char ch) {return ++ch;}   //此为函数重载
}
;
void main()
{    CBase *p=new CDerive;
    
int n=p->func(40);        //调用基类的 func()
    cout<<" the result is : "<<n<<endl;
}
                     
运行结果:
       the result is : 39
                       
          

例2:

                 
#include <iostream.h>
class CBase
{
public:
    
virtual int func(unsigned char ch) {return --ch;}
}
;
class CDerive : public CBase
{
    
int func(unsigned char ch) {return ++ch;}      //此为虚函数
}
;
void main()
{    CBase *p=new CDerive;
    
int n=p->func(40);        //调用派生类的 func()
    cout<<" the result is : "<<n<<endl;
}
                
               
运行结果:
        the result is : 41


这个例子可以验证

“ 3. 一个指针实际上可能指向了衍生类对象,当虚函数被指针调用时,绑定哪个函数取决于被指对象的类,而不是指针的类型;

你可能感兴趣的:(C++)