手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

重载、覆盖和隐藏 之细谈

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

进入原帖讨论:http://www.bc-cn.net/bbs/dispbbs.asp?BoardID=56&ID=76966

网上的关于重载、覆盖和隐藏到处都搜得到,但发现讲的都是什么是什么方式,并没有细讲到每一个要点,更有最近几个论坛发现有些人问这方面的问题,便写了一下自己的关点,供初学者学习.下面我们来讨论一下.
[以下内容由作者stylev原创,如有转载,请注明]
--------------------------------------------------------------------------------------------------------------------------


重载(overload)
这个好理解,在同个space域同名的.
参数必须不同,有关virtual无关.

--------------------------------------------------------------------------------------------------------------------------


覆盖(override)
同名字,同参数,有virtual

覆盖好理解比如show()函数
A派生了B
假如B中的show()覆盖了A中的show()
但B中仍然有两个show(),而不管是A类指针也好,B类对象调用也好,都只能调用B类自己的那个show();
而从A类继承过来的show()函数真的就被覆盖了,没有了吗? 答应是不对的.这时能够在B类对象显示的调用A类继承过来的show();

程式代码:
#include <iostream>
using namespace std;
class A
{
public:
virtual void show()
{
cout << a << endl;
}

int a;
};
class B:public A
{
public:
void show()
{
A::show();
//显示的调用自己类中的 "由A类继承过来的show()函数"
//像这种直接显示指出某个类的某个函数时,
//编译器处理方式是这样的: 首先在自己类中找有没有A::show(),假如找到,调用.不在继续在A类中找
//假如很难找到,则在显示指出的那个类中(即A类)调用那个函数. 这里当然是在B类中能够找到A::show()
//因为基类中指出了这个函数是virtual函数.
}
int b;
};

int main()
{
A a;
a.a = 3;
a.show();
B b;
b.b = 4;
b.show();
b.A::show(); //显示的调用自己类中的 "由A类继承过来的show()函数"
return 0;
}


总结:
virtual, 覆盖.
其实准确,通俗的讲B类还是有两个show(),只是调用由A继承过来的show()只能通过显示的调用方法 [类名::virtual函数名]
而不管是基类A的指针 (B b; A *p = &b; p->show())或派生类的对象(B b; b.show()),都只能调用B类的自己本身存在的show()函数

-----------------------------------------------------------------------------------------------------------------------

隐藏hide
这个有点麻烦了...
什么是隐藏情况?
1,同名同参无virtual
2,同名不同参不管有无virtual

程式代码:
class A
{
public:
void show() {}; //编号1
void rose(int a) {} //编号2
};
class B:public A
{
public:
void show() {}; //编号3
void rose(int a, int b) {}; //编号4
};

//
类B中的show()和rose()明显是隐藏了类A的show()和rose()
隐藏的理解:
B类中其实有两个show(),两个rose();
但为什么不叫重载呢?您会这样想,但我能够告诉您,因为类B中的两个show(),两个rose(),不是都能够被类B对象调用的.

//----1----//
编号1和编号2,在类B中哪怕存在,但只能通过类A的指针调用,而不能通过B类对象调用,如:

程式代码:
A *p = new B;
p->show();
p->rose(3);
p->rose(3,5); //error


//----2----//
编号3和编程4,只能通过类B对象调用,而不能通过类A的指针调用,如:

程式代码:
B b;
b.show();
b.rose(3,5);
b.rose(4); //error


----------------------------------------//如有错误或不明之处,请发电子邮件给我stylev@msn.com//--------------------------------




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS