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++根据指针指向对象的类型来决定调用虚函数的哪个定义,在这里,指针所指向的类型为子类对象,所以虚函数使用子类的函数。相关文章推荐
- C语言中的整数自动转换原则
- c++第二次试验
- C++第二次作业
- 一起talk C栗子吧(第一百三十四回:C语言实例--创建线程时的内存细节)
- C++作业2:距离
- c++第二次实验
- 设计模式之 创建者(Builder)模式(C++实现)
- C++作业02
- C++作业2:分段函数
- C++作业2
- c++第三次实验
- C++作业2
- 用平方根算法判断素数(C语言)
- 一起talk C栗子吧(第一百三十三回:C语言实例--创建进程时的内存细节)
- C++实验2-体重与身高
- c++中调用python脚本提示 error LNK2001: 无法解析的外部符号
- 我的C++第二次作业
- 出现次数最多的数
- C++primer 练习10.16
- c++中生成n个m位的随机不重复字符串的一种方法(字母+数字)