| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1454 人关注过本帖, 1 人收藏
标题:[原创]重载、覆盖和隐藏 之细谈
只看楼主 加入收藏
stylev
Rank: 1
等 级:新手上路
威 望:1
帖 子:136
专家分:0
注 册:2006-5-30
收藏(1)
 问题点数:0 回复次数:4 
[原创]重载、覆盖和隐藏 之细谈

重载、覆盖和隐藏
~~~~~~~~~~~~~~~~

网上的关于重载、覆盖和隐藏到处都搜得到,但发现讲的都是什么是什么方式,并没有细讲到每一个要点,还有最近几个论坛发现有些人问这方面的问题,便写了一下自己的关点,供初学者学习.下面我们来讨论一下.
[以下内容由作者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//--------------------------------

搜索更多相关主题的帖子: 重载 隐藏 
2006-07-07 02:44
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
总结的很好。

http://myajax95./
2006-07-07 03:01
hubin
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-7-6
收藏
得分:0 
很细致
2006-07-07 07:19
baisea2001
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2005-10-27
收藏
得分:0 

受益非牵!好东西!
谢谢

2006-08-13 01:41
xingfhao
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2007-2-8
收藏
得分:0 
不错。受教了。

2007-02-08 09:26
快速回复:[原创]重载、覆盖和隐藏 之细谈
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017835 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved