正好复习到了这部分,整理一下,主要是翻译课件。
虚函数和指针结合使用可以产生最大的效果。
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;
}
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;
}
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. 一个指针实际上可能指向了衍生类对象,当虚函数被指针调用时,绑定哪个函数取决于被指对象的类,而不是指针的类型;”