您的位置:首页 > 编程语言 > C语言/C++

C++中的重载、覆盖、隐藏的区别

2014-08-10 15:47 330 查看
1.重载(overload)的特征:
a).几个函数如果是重载,那么他们的作用域相同,即在同一个范围内。【例如:在同一个类中,或者在同一个全局中】
b).函数名字必须相同,但是参数必须不同【个数可以不同,类型也可以不同】
c).virtual关键字可有可无.
重载的作用就是同一个函数有不同的行为
2.覆盖(override)的特征:
a).覆盖指的是派生类的函数覆盖基类的函数,因此范围不同,一个是在基类,一个是在派生类中。
b).函数名字和参数都必须完全相同。
c).virtual关键字必须出现在基类的函数中。
所谓的覆盖指的是:用基类对象的指针或者引用访问虚函数时会根据实际的类型决定所调用的函数
3.隐藏(hide)的特征:
a).派生类的函数隐藏(或者说是屏蔽)了与其同名的基类的函数。隐藏的理解:在调用一个类的成员函数的时候,编译器会沿着类的继承链逐级的向上查找函数的定义,如果找到了,那么就停止查找了。所以如果一个派生类和他的基类都有同一个同名(且不论其参数)的函数,而编译器最终选择了派生类中的函数,那么就说派生类中的成员函数隐藏了基类中的成员函数,也就是说它阻止了编译器继续向上查找的行为。
b).因为覆盖中说到了基类中的函数存在了virtual关键字,且名字和参数都相同的情况下是覆盖了,那么隐藏的特点就是如下了:
1).在派生类和基类中函数名相同,但参数不同(因为参数不同就不会构成了覆盖的特点),所以,virtual关键字已经显得不重要了,此时就只能构成隐藏了
2).在派生类和基类中的函数名相同,参数相同,此时就要看virtual关键字了,要是没有此关键字就构成隐藏了,有此关键字就是前面所说的覆盖了。
总结:函数的覆盖是发生在派生类与基类之间,两个函数必须完全相同,并且都是虚函数。那么不属于这种情况的,就是隐藏了
【覆盖的函数是多态的,是存在vbtl中的函数才能构成覆盖的关系;而隐藏的函数都是一般的函数,不支持多态,是在编译阶段就确定了的】
参见源码:

#include <iostream>

using namespace std;

class Base
{
public:
//重载1
void func(int,int)
{

}

//重载2
int func(string,int)
{
cout << "基类方法" << endl;
return 0;
}
//重载3
void func(bool)
{

}

virtual bool funcA(char)
{
cout << "基类的虚函数" << endl;
return false;
}
};

class ItemA : public Base
{
public:
//基类方法被隐藏:1)派生类和基类中函数名相同,但参数不同,是隐藏
void func(int a,int b,int c)
{

}
//基类方法被隐藏:2)派生类和基类中函数名相同,参数也相同,没有virtual
int func(string,int)
{
cout << "子类方法" << endl;
return 0;
}

//发生覆盖的情况:覆盖是发生在派生类与基类之间,两个函数必须完全相同,并且都是虚函数(子类不必标识virtual)
bool funcA(char)
{
cout << "子类的虚函数" << endl;
return false;
}
};

int main()
{
ItemA itemA;
Base& obj = itemA;
obj.funcA('c');
obj.func("hello",1);//虚机制没有起作用,obj被认为父类对象,所以执行父类的版本
itemA.func("hello",1);//执行子类方法,父类方法被隐藏
//itemA.func(true);  //error:父类的void func(int,int)和 void func(bool)被隐藏了,不能直接用子类调用了
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: