当派生类和基类中各自实现一个内容不同但函数名和参数类型完全相同的方法时,会怎样?
答案是:基类对象调用的是基类的方法,派生类对象调用执行的是派生类中重新提供的方法。
这种派生类中同名同参方法替代掉基类方法的现象,叫做:重定义(redefining),也有人叫做隐藏。隐藏特性生效时派生类中实际同时存在2份同名同参(但在不同类域名中)的方法,同时都存在,只是一个隐藏了另一个。
//基类 person.cpp
void person::speak(void) {
cout << "person speak" << endl;
}
//派生类 man.cpp
void man::speak(void) {
cout << "man speak" << endl;
}
// 如何调用基类的方法
void man::test(void)
{
//speak(); // 其实等于this->speak(),所以其实调用的是当前对象的speak方法
man::speak();
person::speak(); // 这样就可以显式指定调用父类的speak方法,绕过了隐藏规则
}
派生类中如何访问被隐藏的基类方法:
(1)派生类对象直接调用时,隐藏规则生效,直接调用的肯定是派生类中重新实现的那一个。
(2)将派生类强制类型转换成基类的类型,再去调用则这时编译器认为是基类在调用,则调用的是基类那一个,隐藏规则被绕过了。
(3)在派生类内部,使用父类::方法()的方式,可以强制绕过隐藏规则,调用父类实现的那一个。