目录
前言:
定义:
分类:
虚函数的函数重写:
类代码:
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();
函数只会执行父类函数,若是父类函数位虚函数,则会执行子函数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)