问题: 由于子类隐藏了父类同名函数,若子类想调用父类同名函数,可以:
1.使用 类名::函数名 显式调用
2.使用 using 类名::函数名 调用
class Father{
public:
void func(){
Afxmessagebox(“Father func”);
}
};
class Person : public Father{
public:
void func(int value){
Afxmessagebox(“Person func”);
}
};
class Son : public Person{
public:
void func(int a, int b){
//类名::函数名 调用方法
Father::func();//调用Father类的func函数
Person::func(a);//调用Person类的func函数
Afxmessagebox(“Son func”);
}
//using声明方法
using Father::func;
void use(){
func();//嗮调用Father类的func函数
}
};
int main(){
Son son;
son. func(1,2);
son. Person::func(1);//通过子类对象调用父类凾数
son. Father::func();
Person& person = son;
personfunc(1);//通过Person类凾数
return 1;
}
1 子类调用父类的同名函数:
子类和父类返回值参数相同,函数名相同,有virtual关键字,则由对象的类型决定调用哪个函数。
子类和父类只要函数名相同,没有virtual关键字,则子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,也可以强制调用父类的同名函数class::funtion_name或者如果在子类的定义中,使用using即可将子类的同名函数暴露,然后可直接调用。
子类和父类参数不同,函数名相同,有virtual关键字,则不存在多态性,子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,也可以强制调用父类的同名函数class::funtion_name。
子类和父类返回值不同,参数相同,函数名相同,有virtual关键字,则编译出错error C2555编译器不允许函数名参数相同返回值不同的函数重载。
2 要求和区分
(1)重载要求:同作用域内,函数名相同,参数不同(个数、类型)、常函数也可以作为重载判断。注意返回值不是重载的判断标准。
(2)重写(即覆盖)要求:要求基类函数为虚函数,且基类函数和派生类函数名、参数等相同。
(3)隐藏(即重定义)要求:子类重新定义父类中有相同名称的非虚函数(参数列表可以不同)。
(4)重写和隐藏都是发生在基类和子类中。