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

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

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

隐藏:
  
派生类中的函数屏蔽了基类中的同名函数,
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();
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值