虚函数:

在程序运行过程中调用函数名相同的函数而实现不同功能的函数

利用虚函数这一特性,我们可以在公有继承的基类(父类)中定义虚函数,而在它们的派生类(子类)中通过基类指针来实现派生类中同名函数的调用

在派生类中定义的同名函数必须是参数类型,顺序,参数的个数以及返回值都相同,否则就成了函数重载

下面我们来看一段代码:

class point//基类
{
    float x,y;
public:
    point(){}
    point(float i,float j){x=i;y=j;}
    virtual float arear(void){return 0.0;}
    //声明基类中的arear函数为虚函数,使得其在派生类和基类同名函数中有一个统一的接口,
    //根据其指向的类来判断其通往哪一个接口
};
const float Pi=3.14159;//定义一个常量

在基类中定义了一个名叫arear返回值为浮点数且没有参数的虚函数

接下来定义了一个公有继承的派生类Cricle

class Cricle:public point//公有继承的派生类
{
    float radius;
public:
    Cricle(float r){radius=r;}
    float arear(void){return Pi*radius*radius;}

};

该派生类公有部分也定义了一个名字叫arear返回值为浮点数,没有参数的同名函数

 

到主函数的实现部分

int main()
{
    point *p ,a;
    Cricle c1(3);
    p=&a; //调用基类公有函数
    cout<<p->arear()<<endl;
    p=&c1;//调用派生类的公有函数
    cout<<p->arear()<<endl;
    //如果没有声明基类的一个对象a则无法通过指针p来调用基类的公有函数
    return 0;
}

声明了一个基类的指针和一个point类的对象a

从上面我们可以看出当指针指向基类对象a时,通过指针调用的同名函数就为基类中的函数

当指针指向派生类对象c1时,调用的函数则是派生类中的函数

通过以上例子不难看出,利用vitual虚函数,我们可以在同名函数的调用上实现不同的功能,也就实现了我们所说的多态性

 似乎在保护继承和私有继承时候不能通过基类指针对派生类函数进行访问,原因是因为此时,基类数据在派生类中相对外部是不可引用的

  

class C:protected virtual A
 C c1(6,7,8,9,10);
 p=&c1;
 p->show();

它会报错说不能通过A来调用C中函数

error: 'A' is an inaccessible base of 'C'