以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- 想明白“C++继承中的重载,覆盖和隐藏”看看这篇文章吧 (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=68748) |
-- 作者:DMman -- 发布时间:10/27/2008 9:37:00 AM -- 想明白“C++继承中的重载,覆盖和隐藏”看看这篇文章吧 谈谈C++继承中的重载,覆盖和隐藏 http://blog.csdn.net/Kendiv/archive/2006/04/25/675940.aspx 写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide)。在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的,他们是英语专业的),常常把重载(overload)和覆盖(override)搞错! 我们先来看一些代码及其编译结果。 实例一: class CB }; void test() int main(int argc, char* argv[]) 如果把派生CD中成员函数void f(int,int)的声明改成和基类中一样,即f(int),基类中的void f(int)还是一样被覆盖,此时编译不会出错,在函数中test调用的是CD中的f(int) 所以,在基类中的某些函数,如果没有virtral关键字,函数名是f(参数是什么我们不管),那么如果在派生类CD中也声明了某个f成员函数,那么在类CD域中,基类中所有的那些f都被隐藏。 我们刚才说的是没有virtual的情况,如果有virtual的情况呢?? #include "stdafx.h" class CB }; }; int main(int argc, char* argv[]) 这么写当然是没问题了,在这里我不多费口舌了,这是很简单的,多态,虚函数,然后什么指向基类的指针指向派生类对象阿,通过引用调用虚函数阿什么的,属性多的很咯,什么??你不明白??随便找本C++的书,对会讲多态和虚函数机制的哦!! 那么如果基类CB中的函数f有关键字virtual ,但是参数和派生类CD中的函数f参数不一样呢, class CB } void test() int main(int argc, char* argv[]) 编译出错了, 通过上面三个例子,得出一个简单的结论 那么其他的情况呢??只要名字一样,不满足上面覆盖的条件,就是隐藏了。 下面我要讲最关键的地方了,好多人认为,基类CB中的f(int)会继承下来和CD中的f(int,int)在派生类CD中构成重载,就像实例一中想像的那样。 在文章中,我把重载和覆盖的定义都给了出来了,但是一直没有给隐藏的定义,在最后,我把他给出来,这段话是网上google来的,比较长,你可以简单的理解成,在派生类域中,看不到基类中的那个同名函数了,或者说,是并没有继承下来给你用,呵呵,如实例一 那样。 隐藏(hide): |
-- 作者:DMman -- 发布时间:10/27/2008 9:42:00 AM -- 和大家探讨一点: c++ VS java 重载 覆盖的区别 重载: C++ 方法必须在同一个域中,而java可以实现 导出类中重载基类中的方法! 覆盖: C++ 基类的方法必须显示声明为virtual 而java默认的有virtual关键字! 注意:
|
-- 作者:kaiyuxing -- 发布时间:11/7/2008 7:57:00 PM -- 没有用Borland C++试过,在VC++ 6.0下和楼主说的不一样。 譬如下面的程序。没有出现什么隐藏现象: #include <iostream.h> class A{ public: void show() {cout<<'A'<<endl;} }; class B:public A{ public: void show(int x=0){cout<<'B'<<endl;} void f() { show(); } }; void main() { } |
-- 作者:DMman -- 发布时间:12/12/2008 10:25:00 AM --
B b; b.f(); 输出的B,而不是A 表明类A中的show()已经被类B中的show(int)覆盖了。 同时,你这里是不规范的,类B中f()中调用的show()被编译器转成了show(int)。
|
-- 作者:秋十三 -- 发布时间:1/2/2009 7:44:00 PM -- 讲的不错啊 |
-- 作者:shark168 -- 发布时间:4/23/2009 9:30:00 PM -- 楼主,我在Vc下面试了啊,即使是类B中的show(int),改为show(int,int),编译任然通过,输出的B |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
62.500ms |