您的位置:首页 > 编程语言 > C语言/C++

C++里的虚函数

2016-03-31 23:14 323 查看
多态是指使用相同的函数名来访问函数不同的实现方法,即“一种接口,多种方法”,用相同的形式访问一组通用的运算,每个运算可能对应的行为不同。

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++根据指针指向对象的类型来决定调用虚函数的哪个定义,在这里,指针所指向的类型为子类对象,所以虚函数使用子类的函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: