虚函数是为了满足多态和泛型编程。
C++允许使用虚函数完成完成运行时决议(运行时多态),与编译时决定(编译时多态,函数重载)不同。
虚函数与纯虚函数
class AbstractBaseClass
{
public:
virtual void fun1(){ // 普通虚函数
cout << "AbstractBaseClass::func1()" << endl;
};
virtual void fun2()=0; // 纯虚函数
};
class BaseClass: public AbstractBaseClass
{
public:
virtual void fun1(){
// 继承来的fun1()已是虚函数,virtual可不加
cout << "BaseClass::func1()" << endl;
}
virtual void fun2(){
cout << "BaseClass::func2()" << endl;
};
};
class DerivedClass
{
public:
void fun1(){
cout << "DerivedClass::func1()" << endl;
}
virtual void fun2(){
cout << "DerivedClass::func2()" << endl;
}
};
含有纯虚函数的类不能实例化对象;
子类如果要实例化对象,继承的纯虚函数(类BaseClass的func2())需重新声明,且不能再次声明为纯虚函数。
含有虚函数的类实例化得到的对象都有虚函数表指针,虚函数表存放虚函数指针,每个虚函数对应一个虚函数指针(与普通指针一致),且该指针总被存放于该对象的地址首位。这些虚函数指针构成了虚函数表,虚函数表被类的所有对象共享。
(虚函数)指针在32位编译器中占4个字节,在64位编译器中占8个字节。
具体占多少可以参考看头文件climits.h