C++ Virtual介绍
2015-06-16 21:36
309 查看
参考链接:/article/4792719.html
学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Derived的print函数而不是Base的print函数。这是面向对象中的多态性的体现。
这也许会使人联想到函数的重载,但稍加对比就会发现两者是完全不同的:
(1)
重载的几个函数必须在同一个类中;
覆盖的函数必须在有继承关系的不同的类中
(2)
覆盖的几个函数必须函数名、参数、返回值都相同;
重载的函数必须函数名相同,参数不同。参数不同的目的就是为了在函数调用的时候编译器能够通过参数来判断程序是在调用的哪个函数。这也就很自然地解释了为什么函数不能通过返回值不同来重载,因为程序在调用函数时很有可能不关心返回值,编译器就无法从代码中看出程序在调用的是哪个函数了。
(3)
覆盖的函数前必须加关键字Virtual;
重载和Virtual没有任何瓜葛,加不加都不影响重载的运作。
学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Derived的print函数而不是Base的print函数。这是面向对象中的多态性的体现。
class Base { public:Base(){} public: virtual void print(){cout<<"Base";} }; class Derived:public Base { public:Derived(){} public: void print(){cout<<"Derived";} }; int main() { Base *point=new Derived(); point->print(); } Output: Derived
这也许会使人联想到函数的重载,但稍加对比就会发现两者是完全不同的:
(1)
重载的几个函数必须在同一个类中;
覆盖的函数必须在有继承关系的不同的类中
(2)
覆盖的几个函数必须函数名、参数、返回值都相同;
重载的函数必须函数名相同,参数不同。参数不同的目的就是为了在函数调用的时候编译器能够通过参数来判断程序是在调用的哪个函数。这也就很自然地解释了为什么函数不能通过返回值不同来重载,因为程序在调用函数时很有可能不关心返回值,编译器就无法从代码中看出程序在调用的是哪个函数了。
(3)
覆盖的函数前必须加关键字Virtual;
重载和Virtual没有任何瓜葛,加不加都不影响重载的运作。
相关文章推荐
- C++ Virtual介绍 分类: C/C++ 2015-06-16 21:36 26人阅读 评论(0) 收藏
- FreeGLUT Tips: Resolve compile error C2664: cannot convert argument 2 from '_TCHAR *[]' to 'char **'
- C语言和Fortran语言的差异
- 迷宫的最短路径 代码(C++)
- 一起talk C栗子吧(第十八回:C语言实例--输出十六进制)
- C++标准库之Unities-笔记2
- C++ extern/static/const
- Bjarne Stroustrup对C++程序员的忠告
- 多态原理探究-从C++编译器角度理解多态的实现原理
- 多态原理探究-从C++编译器角度理解多态的实现原理
- C、C++的Makefile的编写以及动、静态库的制作调用(包括MAC地址的获取及MD5加密)
- VS2012 C语言dll文件生成和C#调用
- c++中class与struct的区别
- 第七章作业
- log4cpp的安装
- C++第六章第五题
- 第六章第一题(其余类似上次派生继承题)
- C++第六章第四题
- C++第六章第三题
- C++的4种类型转换关键字及其特点