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

c++覆盖 重载 隐藏 的关系

2016-04-06 19:55 357 查看
重载:
    只有在 同一类定义中的同名成员函数才存在重载关系 ,主要特点是函数的参数类型和数目有所不同
,但 不能出现函数参数的个数和类型均相同,仅仅依靠返回值类型不同来区分的函数,这和普通函数的重载是完全一致的。另外,重载和成员函数是否是虚函数无关

覆盖:
    派生类中覆盖基类中的同名函数,要求两个函数的参数个数、参数类型、返回类型都相同,且基类函数必须是虚函数。

隐藏:
  
派生类中的函数屏蔽了基类中的同名函数,
2个函数参数相同,但基类函数不是虚函数(和覆盖的区别在于基类函数是否是虚函数)。2个函数参数不同,无论基类函数是否是虚函数,基类函数都会被屏蔽(和重载的区别在于两个函数不在同一类中)。

#include <iostream>

using namespace std;
class A
{
public:
//virtual int b; //错误,不能把成员变量声明为虚有的
virtual void f()
{
cout << "继续" << endl;
}
virtual void h(int i = 1, int j = 2)
{
cout << "继续H" << endl;
}
~A(){
cout << "析构A" << endl;
}
};
class B :public A
{
public:
int b;
void f(int i)//重载虚函数f
{
cout << "paif()" << endl;
}
void f(){//在派生类中重定义虚函数f
cout << "paixu" << endl;
}
void h(){ //重载虚函数h的版本。注意这里不是对基类虚函数的重定义。
int b;
b = 5;
cout << "B的" << b << endl;
}
void h(int i, int j = 3){
int b;
b = j;
cout << "paixuH" << b << endl;
}//当基类中的虚函数有默认形参时,派生类中重定义基类中的虚函数的版本必须有相同数量的形参,
//形参可以有默认值,也可以没有。如果形参数量不一样多则是对虚函数的重载。
~B(){
cout << "析构B" << endl;
}
};
int main(){
B m;
A *p = &m;
//p->b=3 //错误,指向派生类的基类指针不能调用派生类中的成员,只能调用基类中的成员,
//除非该成员是虚函数
//p->f(); //调用派生类中的函数f
// p->f(4);//错误,注意这里不是在调用派生类中带一个形参的f函数,因为带一个参数的f函数不是虚函数,
//用指向派生类的基类指针时不会调用派生类中的函数,除非这个函数是虚函数。这里基类中没有定义这种 //带一个形参的f函数,所以这时会出现错误。

// p->A::f(); //调用基类的虚函数f,可以用作用域运算符使用指向派生类的基类指针调用基类的虚函数
// p->h();//调用派生类中的虚函数版本h,用指向派生类的基类指针调用虚函数时派生类中的虚函数的默认值在这里不起作用。虽然派生类中的虚函数需要一个参数,

//但这里不给参数仍是调用的派生类的带两个参数的虚函数h,而不是调用派生类中的不带参数的h函数

// m.h(); //调用派生类中不带参数的h函数,如果要用对象调用派生类中带两个形参的h函数,在本例中必须使用一个实参值。
//m.h(1);//调用派生类中带两个形参的h函数,用对象调用派生类中的虚函数时函数的默认值不受基类虚函数默认值的影响
//m.A::h(1);// 调用基类中的虚函数h.
getchar();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: