C++ 函数重写

目录

前言:

定义:

分类:

虚函数的函数重写:

类代码:

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();

结果:

C++ 函数重写_第1张图片

 分析:

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

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

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

结果:

C++ 函数重写_第2张图片

 非虚函数重写:

主函数不变:

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

结果:

C++ 函数重写_第3张图片

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

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

	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();

C++ 函数重写_第4张图片

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

你可能感兴趣的:(C++知识,c++)