2021-03-19 调用父类同名不同参函数,以及重载、重写(覆盖)、隐藏(重定义)

问题: 由于子类隐藏了父类同名函数,若子类想调用父类同名函数,可以:
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)重写和隐藏都是发生在基类和子类中。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值