C++学习笔记24,方法重写与方法隐藏

该博文仅用于交流学习,请慎用于任何商业用途,本博主保留对该博文的一切权利。

博主博客:http://blog.csdn.net/qq844352155

转载请注明出处:

方法重写.是指在子类中重新编写父类中的虚函数的实现.要求子类中的函数必须跟父类中的原型一致.

包括返回值类型(协变返回类型不算)以及参数的数目,排列顺序.

#include <iostream>
#include <string>
using namespace std;
class base{
public:
	virtual	void show(int i,string s){
		cout<<i<<"+"<<s<<endl;
		cout<<"This is base show!"<<endl;
	}
};
class dirved:public base{
public:
	virtual void show(int i,string s){
		cout<<i<<"&"<<s<<endl;
		cout<<"This is dirved show!"<<endl;
	}
};

int main(){
	base b;
	b.show(10,"base");
	dirved d;
	d.show(20,"dirved");
}

通过方法的重写,即可定义同一函数在继承层次中的不同行为!

如果在子类中使用父类虚方法的名称,但是参数不同,那么这个不是重写父类的方法,也不会重载方法,而是创建一个新方法.

#include <iostream>
#include <string>
using namespace std;
class base{
public:
	virtual	void show(int i,string s){
		cout<<i<<"+"<<s<<endl;
		cout<<"This is base show!"<<endl;
	}
};
class dirved:public base{
public:
	/*
	virtual void show(int i,string s){
		cout<<i<<"&"<<s<<endl;
		cout<<"This is dirved show!"<<endl;
	}*/
	virtual void show(){
		cout<<"This is void dirved show!"<<endl;
	}
};

int main(){
	base b;
	b.show(10,"base");
	dirved d;
	//d.show(20,"dirved");
	d.show();
}

这个时候,父类中的show()方法将被隐藏,即dirved类中无法再使用show(int,string)方法.

#include <iostream>
#include <string>
using namespace std;
class base{
public:
	virtual	void show(int i,string s){
		cout<<i<<"+"<<s<<endl;
		cout<<"This is base show!"<<endl;
	}
};
class dirved:public base{
public:
	/*
	virtual void show(int i,string s){
		cout<<i<<"&"<<s<<endl;
		cout<<"This is dirved show!"<<endl;
	}*/
	virtual void show(){
		cout<<"This is void dirved show!"<<endl;
	}
};

int main(){
	base b;
	b.show(10,"base");
	dirved d;
	d.show(20,"dirved");
	d.show();
}

编译结果:

可以看出,对于dirved类来说,show(int,string)这个方法被隐藏起来了,即对于dirved对象来说不可见了!因此只要在子类中重新定义了父类的虚方法,父类中的所有与该方法重载的方法都将被隐藏!

这一点需要特别注意!

下面再看一些有趣的东西:

#include <iostream>
#include <string>
using namespace std;
class base{
public:
	virtual	void show(int i,string s){
		cout<<i<<"+"<<s<<endl;
		cout<<"This is base show!"<<endl;
	}
};
class dirved:public base{
public:
	virtual void show(int i,string s){
		cout<<i<<"&"<<s<<endl;
		cout<<"This is dirved show!"<<endl;
	}
};

int main(){

	dirved d;
	d.show(10,"show()");
	base &ref=d;
	ref.show(100,"ref show()");
}

子类中正确的重写了父类中的show方法,

结果没有疑问.但是如果你重写子类的show方法的时候,发现应该用double代替int,于是i更改为

#include <iostream>
#include <string>
using namespace std;
class base{
public:
	virtual	void show(int i,string s){
		cout<<i<<"+"<<s<<endl;
		cout<<"This is base show!"<<endl;
	}
};
class dirved:public base{
public:
	virtual void show(double i,string s){
		cout<<i<<"&"<<s<<endl;
		cout<<"This is dirved show!"<<endl;
	}
};

int main(){

	dirved d;
	d.show(10,"show()");
	base &ref=d;
	ref.show(100,"ref show()");
}

运行结果:

看到没有!最后那个ref.show(int,string)调用了base里面的show方法!(100可以换成9.8更明显)

明明是dirved对象的引用,怎么就调用了base里面的show方法呢?因为这实际上是创建了一个新方法!

可用override关键字来避免这种情况!

#include <iostream>
#include <string>
using namespace std;
class base{
public:
	virtual	void show(int i,string s){
		cout<<i<<"+"<<s<<endl;
		cout<<"This is base show!"<<endl;
	}
};
class dirved:public base{
public:
	virtual void show(double i,string s)override{
		cout<<i<<"&"<<s<<endl;
		cout<<"This is dirved show!"<<endl;
	}
};

int main(){

	dirved d;
	d.show(10,"show()");
	base &ref=d;
	ref.show(95.9,"ref show()");
}

override表示你是想要重写base类的show方法而不是创建一个新的show方法,因此如果参数不对就会报错!

需要注意的是,即便是重写,只要在子类中重新定义了,父类中的相应重载函数都将会被隐藏!

如果不想既想使用父类中的show,又想重写某一个show(),可以利用using

#include <iostream>
#include <string>
using namespace std;
class base{
public:
	virtual	void show(int i,string s){
		cout<<i<<"+"<<s<<endl;
		cout<<"This is base show!"<<endl;
	}
	virtual void show(){
		cout<<"this is a void show"<<endl;
	}
};
class dirved:public base{
public:
	//using
	using base::show;
	virtual void show(int i,string s)override{
		cout<<i<<"&"<<s<<endl;
		cout<<"This is dirved show!"<<endl;
	}
};

int main(){

	dirved d;
	d.show(10,"show()");
	base &ref=d;
	ref.show(95.9,"ref show()");
	d.show();
}

这样就两全其美啦!

C++学习笔记24,方法重写与方法隐藏

时间: 2024-10-12 13:22:13

C++学习笔记24,方法重写与方法隐藏的相关文章

前端学习笔记汇总(之merge方法)

学习笔记 关于Jquery的merge方法 话不多说,先上图 使用jquery时,其智能提示如上,大概意思就是合并first和second两个数组,得到的结果是first+(second去重后的结果)的并集 接下来,做出测试: 1 $(function () { 2 var arr1 = ['apple', 'orange',1, 'cherry', 'orange']; 3 var arr2 = ['chen', 343, true, 'cherry',1]; 4 var result = $

《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回

<深入Java虚拟机学习笔记>- 第19章 方法的调用与返回

【Cocos2D-X 学习笔记】Node父类的方法和属性

Node方法: 1.创建节点 Node *childNode=Node::create(); 该方法多为Node的子类调用create()静态方法进行创建实例 2.增加新的子节点:node->addChild(childNode,1,Tag); //1是指Z轴的索引,简单讲表示层号,这里addChild并不是个静态方法,因此需要进行指针调用,另外根据多态性(函数重载),其形参还可以是 addChild(childNode,int zOrder)  或者addChild(childNode); 3

Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)

计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript学习笔记(3--this/call/apply) Java程序猿的JavaScript学习笔记(4--this/闭包/getter/setter) Java程序猿的JavaScript学习笔记(5--prototype) Java程序猿的JavaScript学习笔记(6--面向对象模拟) Java程

方法重写和方法重载

重写和重载虽然都有一个共同点是发生在方法之间,但是两者之间没有任何的关系! 方法重载:是指一个类中有多个方法,这些方法的名字一样,但是形参不一样 方法重写:发生在子类和父类之间,当子类继承了父类之后,子类就拥有了父类中定义的方法,当然除了构造器没有继承,子类可以去调用父类的方法,也可以重写,在子类中重写父类的方法,保证方法名一样,形参也要一样吧,这样子类再访问这个方法时就会默认使用这个在子类中被重写的方法,而不是父类中那个被覆盖的方法. 当然,我们如果想在子类中使用父类中被覆盖的方法,我们可以使

方法重写与方法重载

继承和多态都是面向对象程序设计的特点.使用继承可以在一个父类的基础上再创建一个子类,这个子类不但拥有父类已有的属性和方法,还可以创建属于自己的属性和方法.由于子类和父类之间的关系,从而引出了方法重写和方法重载的问题.方法重写及方法重载在继承和多态性方面的应用中会存在很多问题,这些概念很容易混淆,掌握重写和重载的区别对学会使用多态的方式编写程序.提高程序的可维护性奠定了基础. 一.方法重写(0veriding)如何定义重写:在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类

方法重写与方法重载的区别

一.方法重写(0veriding) 在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量. 子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆写或覆盖. 重写体现了Java优越性,重写是建立在继承关系上,它使语言结构更加丰富.在Java中的继承中,子类既可以隐藏和访问父类的方法,也可以覆盖继承父类的方法. 在Java中覆盖继承父类的方法就是通过方法的重写来实现的.

Java方法重写与方法重载

继承和多态都是面向对象程序设计的特点.使用继承可以在一个父类的基础上再创建一个子类,这个子类不但拥有父类已有的属性和方法,还可以创建属于自己的属性和方法.由于子类和父类之间的关系,从而引出了方法重写和方法重载的问题.方法重写及方法重载在继承和多态性方面的应用中会存在很多问题,这些概念很容易混淆,掌握重写和重载的区别对学会使用多态的方式编写程序.提高程序的可维护性奠定了基础.一.方法重写(0veriding)如何定义重写:在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所

Java之方法重写、方法重载、多态

Java之方法重写.方法重载.多态博客分类: java语言Java重写重载多态 一.方法重写(Override) 子类可以重写父类的方法. 方法的返回值类型.参数类型.参数个数都不能改变,只能重写方法体. 方法的重写规则 参数列表必须完全与被重写方法的相同: 返回类型必须完全与被重写方法的返回类型相同: 访问权限不能比父类中被重写的方法的访问权限更低. 例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected. 解释:用于多态(父类引用子类对象). 声明