C++里的虚函数

来源:互联网 发布:上海零境网络 起诉 编辑:程序博客网 时间:2024/05/22 17:31
多态是指使用相同的函数名来访问函数不同的实现方法,即“一种接口,多种方法”,用相同的形式访问一组通用的运算,每个运算可能对应的行为不同。C++支持编译时多态和运行时多态,运算符重载和函数重载就是编译时多态,而派生类和虚函数实现运行时多态。

运行时多态的基础是基类指针,基类指针可以指向任何派生类对象。

1.虚函数是为了实现多态而存在的

#include using namespace std;class F{    public:    void novir(){            cout << "father novir" <<endl;        }        virtual void vir(){            cout<< "father vir"<<endl;        }}; class S : public F{    public:    void novir(){            cout << "son novir"<<endl;        }        void vir(){            cout << "son vir"<<endl;        }};int main(){        F f;        S s;        s.novir();// 子类起作用,输出为 son novir        s.vir();//子类起作用,输出为son vir        f.novir();//父类起作用(因为其本身在这里与子类没有关            系),输出father novir        f.vir();// 父类起作用(因为其本身在这里与子类没有关系),输出father vir        F *ff;        ff = &s;//将一个父类指针指向一个子类对象;子类指针不能指向父类对象        ff->novir();//父类起作用,显示father novir        ff->vir();//子类起作用,虚函数多态的用处,显示 son vir,具体参见下面解释        return 0;}

输出:
[root@localhost root]# ./vir
son novir
son vir
father novir
father vir
father novir
son vir

虚函数的多态体现

我们都知道,程序运行的过程要经过 预处理,编译,运行,链接等步骤。虚函数在程序运行的时候才被绑定,编译的时候不进行相关处理,只有运行的时候才对其进行相关操作。

所以在程序片:

F *ff;    ff = &s;//将一个父类指针指向一个子类对象;子类指针不能指向父类对象    ff->novir();//父类起作用,显示father novir

ff->vir();//子类起作用,虚函数多态的用处,显示 son vir

程序在运行时决定调用虚函数的哪个定义,这个决定依赖于基类型指针所指向的对象的类型。通过点运算调用虚函数时,忽略了虚函数的多态性,只有使用基类型指针访问虚函数,运行时的多态性才得以体现。即C++根据指针指向对象的类型来决定调用虚函数的哪个定义,在这里,指针所指向的类型为子类对象,所以虚函数使用子类的函数。

0 0
原创粉丝点击