温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++中覆盖和隐藏的示例分析

发布时间:2021-08-30 13:46:20 来源:亿速云 阅读:114 作者:小新 栏目:开发技术

这篇文章给大家分享的是有关C++中覆盖和隐藏的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1. 前言

继承是面向对象编程的重要特性,在c++中,当父类与子类出现同名函数时,会出现两种情况:覆写和隐藏

2. 共性

当子类继承父类,并且子类中有父类同名函数,那么子类将隐藏父类中所有同名函数,不可以对父类中同名函数直接进行访问,此时子类调用父类中函数需要用域操作符::

#include<iostream>
using namespace std;
class A{
	public:
		void fun1(){
			cout<<"A::fun1()"<<endl;
		}
		void fun1(int){
			cout<<"A::fun1(int)"<<endl;
		}
		void fun2(){
			cout<<"A::fun2()"<<endl;
		}
};
class B:public A{
	public:
		void fun1(){
			cout<<"B::fun1()"<<endl;
		}
};
int main(){
	B b;
	b.fun1();//调用子类b的fun1()函数
    //b.fun1(3);尝试调用父类fun1(int)函数会报错:error:no matching function for call to 'B::fun1(int)'
	b.A::fun1();//调用父类A的fun1()函数
	b.A::fun1(3);//调用父类A的fun1(int)函数
	b.fun2();//调用父类A的fun2()函数
	return 0;
}

C++中覆盖和隐藏的示例分析

b调用fun1()函数,会调用子类b的fun1()函数,而尝试使用b.fun(3)调用父类的void fun(int)函数时,会报错,因为父类中的同名函数都被隐藏。此时调用父类中函数的方法是使用域操作符::。

当父类中同名函数拥有virtual修饰符修饰时,此时子类对父类函数进行覆写

#include<iostream>
using namespace std;
class A{
	public:
		virtual void fun1(){
			cout<<"A::fun1()"<<endl;
		}
		void fun1(int){
			cout<<"A::fun1(int)"<<endl;
		}
		void fun2(){
			cout<<"A::fun2()"<<endl;
		}
};
class B:public A{
	public:
		virtual void fun1(){
			cout<<"B::fun1()"<<endl;
		}
};
int main(){
	B b;
	b.fun1();//调用子类b的fun1()函数
    //b.fun1(3);尝试调用父类fun1(int)函数会报错:error:no matching function for call to 'B::fun1(int)'
	b.A::fun1();//调用父类A的fun1()函数
	b.A::fun1(3);//调用父类A的fun1(int)函数
	b.fun2();//调用父类A的fun2()函数
	return 0;
}

C++中覆盖和隐藏的示例分析

可见即使是虚函数覆写,也会隐藏父类中的所有同名函数。

当子类与父类有同名函数,无论是覆写还是隐藏的方式,在子类自身进行函数调用时,会调用子类函数而隐藏父类的所有同名函数,要访问父类函数需要通过域操作符进行访问。

3. 区别

覆写与隐藏的区别可以体现在基类指针的使用上,比如以下程序

#include<iostream>
using namespace std;
class A{
	public:
		void function1(){
			cout<<"A::function1"<<endl;
		}
		virtual void function2(){
			cout<<"A::function2"<<endl;
		}
};
class B:public A{
	public:
		//隐藏基类function1
		void function1(){
			cout<<"B::function1"<<endl;
		}
};
class C:public A{
	public:
		//覆写基类function2
		virtual void function2(){
			cout<<"C::function2"<<endl;
		}
};
int main(){
	A *a;
	B b;
	C c;
	a=&b;
	a->function1();
	a=&c;
	a->function2();
	return 0;
}

C++中覆盖和隐藏的示例分析

b隐藏基类的同名函数function1(),当基类指针a指向子类b时,调用的是a的function1()函数,而子类c覆写a的同名函数function2(),当基类a指针指向子类c,调用的是c的function2()函数。

利用覆写的特点,可以实现c++的多态特性。

4. 区分

隐藏:当父类函数与派生类函数同名,并且父类函数无virtual关键字修饰,无论父类与派生类参数个数与类型是否相同,此时派生类函数隐藏父类所有同名函数

覆写:当父类函数与派生类函数同名,并且参数相同,返回值相同,并且父类函数有virtual关键字修饰,此时派生类函数覆写父类函数

感谢各位的阅读!关于“C++中覆盖和隐藏的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI