5.1 重载和覆盖有什么区别?
重载是指函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来所是这样的)。在同一可以访问区域内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同一函数,程序会根据不同的参数列表进行调用,对于重载函数的调用,在编译期间就已经确定,是静态的,他们的地址在编译期间就绑定了与多态无关。
重载并不关心函数的返回值类型。其成员函数的特征为:
- 相同的范围(在同一个类中)。
- 函数名字相同。
- 参数不同。
- virtual关键字可有可无。
覆盖是指派生类中存在重新定义基类的函数,其函数名,参数列,返回值类型必须和父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖函数版本,而不是父类中的被覆盖多的函数版本,它和多态真正的相关,当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间时无法确定的,因此这样的函数地址是在运行期绑定的。
覆盖的特征如下:
- 不同的范围(分别位于派生类和父类)
- 函数名字相同
- 参数相同
- 基类函数必须有virtual关键字
重载和覆盖的区别如下:
- 覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。
- 覆盖只能由一个方法,或者只能由一对方法产生关系;方法的重载是多个方法之间的关系。
- 覆盖要求参数列表相同;重载要求参数列表不同。
- 覆盖关系中,调用方法体是根据对象的类型(对象对应存储空间类型)来决定的,重载关系是根据调用时实参表与形参表来选择方法体的。
隐藏时指派生类的函数屏蔽了与其同名的基类函数,规则如下:
- 如果派生类的函数与基类的函数同名,但是参数不同,则不论有无virtual关键字,基类的函数都将被隐藏。
- 如果派生类的函数与基类的函数同名,参数也相同,但是基类函数没有virtual关键字,则此时的基类函数被隐藏。
5.2什么是可重入函数?C语言中如何写可重入函数?
可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果正确性的函数。
在C语言中编写可重入函数时,尽量不要使用全局变量或静态变量,如果使用了全局变量或静态变量,就需要特别注意对这类变量访问的互斥。一般采取:信号量机制,关调度机制,关中断机制等方式进行保证函数的可重入性。