C++ 函数重写

C++ 函数重写,第1张

目录

前言:

定义:

分类:

虚函数的函数重写:

类代码:

main函数:

结果:

 分析:

如果主函数变了会怎么样?

结果:

 非虚函数重写:

子类重写函数调用父类函数:


前言:

今天遇到一个问题,C++的问题,函数重写。


自从上学的时候学过C++重写的定义,以及做过点题就再也没有思考过这个问题。


结果今天再项目中就遇到了这个问题,一个模块的子类需要重写父类的函数,然后执行完子类的函数再执行一遍父类的函数。


这个问题问我们领导,领导只告诉我怎么做,具体为什么没说,而后我自己写了个demo自己琢磨了一下,把自己琢磨出的东西记录下来,对不对不知道,就是自己瞎琢磨出来的。


定义:

C++的函数重写的定义其实就是父类有一个函数A,子类继承了父类的A函数,看A函数不顺眼,自己重新实现了一下。


这个就是函数重写。


与函数重载有本质区别,函数重载是要求函数名一样,但是返回值或者函数的参数至少有一个是不一样的。


分类:

函数重写个人认为分为两类。


一类是虚函数函数重写,一类是非虚函数重写。


虚函数的函数重写:

虚函数的函数重写与多态有着千丝万缕的关系,或者说就是多态的实现。


类代码:
class Base
{
public:
	virtual void option()
	{
		cout << "Base func!" << endl;
		cout << "Base addr = " << this << endl;
	}

};

class Abase : public Base
{
public:
	virtual void option()
	{
		cout << "AAA Base func!" << endl;
		cout << "AAA Base addr = " << this << endl;
		Base::option();
	}
};
main函数:
	Base* b = new Abase();
	b->option();
结果:

 分析:

虚函数重写父类和子类的函数地址相同,子类函数是通过动态绑定实现的。


如果主函数变了会怎么样?
	Base* b = new Base();
	b->option();
	Abase* ab = new Abase();
	ab->option();
结果:

 非虚函数重写:

主函数不变:

	Base* b = new Base();
	b->option();
	Abase* ab = new Abase();
	ab->option();

结果:

子类重写函数调用父类函数:

虽然虚函数和非虚函数的重写在内存地址上有所不同,但是子类重写函数调用父类的函数方法是一样的。


	void option()
	{
		cout << "AAA Base func!" << endl;
		cout << "AAA Base addr = " << this << endl;
		Base::option();
	}

就是在最后加上Base::option();即可。


若非虚函数:

主函数:

	Base* b = new Base();
	b->option();
	Base* ab = new Abase();
	ab->option();

 函数只会执行父类函数,若是父类函数位虚函数,则会执行子函数。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/607824.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-14
下一篇 2022-04-14

发表评论

登录后才能评论

评论列表(0条)

保存