在学习C++的时候,在了解到多态类(存在虚函数的类)的时候我知道了有关对象模型的概念,在剖析了有关对象模型的知识后,对于其中的派生类继承一个多态基类的时候,会对父类的虚函数进行重写,重写也就是所谓的覆盖掉继承自父类的函数,将自己的对象模型中的相应的虚函数的槽位改为自己的函数,但是问题来了,我们之前学习了函数的重载,还有继承中的函数隐藏,这些到底有什么区别?所以做以下的整理希望能帮到在这里迷惑的你
首先写一段代码
#include<iostream>
using namespace std;
class Base
{
virtual void h()
{
cout << "Base" << endl;
}
virtual void g(); //基类中的两个g()构成的是重载
void g(int i);
void j();
};
class D :public Base
{
virtual void h() //重写父类的函数
{
cout << "D" << endl;
}
virtual void g(float f); //隐藏父类的函数
void g(int i); //隐藏父类的函数
};
上面的代码中写出来了函数重载、覆盖、隐藏的三种关系
我通过下面几个条件来区分他们
1.作用域
函数重载:相同的作用域,发生在一个类体内
函数覆盖:不同的作用域,发生在基类和派生类中
函数隐藏:不同的作用域,发生在基类和派生类中
2.函数原型
函数重载:在同个类体中,函数名相同,返回值和参数不同(两个可都不同也可一者不同)
函数覆盖:函数原型必须相同(协变不做考虑),函数名和参数都相同
函数隐藏:如果函数原型相同但是基类函数不是virtual;如果函数名相同,但是参数列表不同不管基类有无virtual关键字
做以下总结:
重载是发生在一个类体中的函数名相同,参数列表或者返回值不同的不同函数;
覆盖是在派生类中的与基类函数原型相同的派生类函数对基类函数的重写;
隐藏是派生类中的与基类不是虚函数的函数原型相同、和与基类的虚函数函数名形同参数列表不同的函数的隐藏。