1、定义和目的
隐藏:
在继承过程中,子类(派生类)的同名函数屏蔽了基类(父类)中的同名函数。这种机制使得通过子类对象调用该函数时,默认调用的是子类的函数,而基类的同名函数被隐藏。隐藏的目的并非出于设计上的直接需求,而是继承关系带来的自然结果,但可能会导致一些非预期的行为。
重写:
在继承关系中,子类重新定义了基类中的虚函数。这要求函数名、参数列表和返回类型都与基类中的虚函数完全一致,只有函数体(实现)不同。重写的目的是为了实现多态性,即允许通过基类指针或引用来调用子类的函数。
2、发生的条件
隐藏:
只要子类中存在与基类同名的函数,无论参数列表是否相同,都会导致隐藏。特别地,如果参数列表相同但基类函数没有virtual修饰,则也是隐藏而非重写。
重写:
只有在基类中定义了虚函数,并且子类中的函数与基类中的虚函数在函数名、参数列表和返回类型上完全一致时,才构成重写。此外,基类中的虚函数必须有virtual修饰。
3、调用方式
隐藏:
当通过子类对象调用同名函数时,默认调用的是子类的函数。如果需要通过子类对象调用基类的同名函数,需要使用作用域解析运算符::来明确指定。
重写:
当通过基类指针或引用来调用虚函数时,实际调用的是指针或引用所指向的对象的函数(即运行时多态)。如果指针或引用指向的是子类对象,则调用的是子类重写后的函数。