巨人笔试一道关于多态的题目

本文详细解析了C++中派生类与基类函数同名时的隐藏概念,探讨了不同情况下函数的调用行为及其实现原理,帮助读者深入理解多态与隐藏的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class A
{
public:
    A()   {};
    ~A(){};
public:
    virtual int func(A a)   { return 1; };

};

class B : public A
{
public:
    B() {};

    ~B() {};
public:
    virtual int func(B b) {return 2;}
};

void main()
{
    B b;
    A* pA = &b;
    int nresult = pA->func(b);
    std::cout<<nresult<<std::endl;
}

//输出 1

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

重载overload的特征:
n          相同的范围(在同一个类中);
n          函数名相同参数不同;
n          virtual 关键字可有可无。

 

覆盖override是指派生类函数覆盖基类函数,覆盖的特征是:
n          不同的范围(分别位于派生类与基类);
n          函数名和参数都相同;
n          基类函数必须有virtual 关键字。(若没有virtual 关键字则称之为隐藏hide)


首先要判断是属于什么,不属于什么

显然 不属于 重载的概念,不属于 覆盖的概念

// 输出解释:

如果派生类的函数与基类的函数同名,但是参数不同。此时,若基类有virtual关键字,基类的函数将被隐式继承到派生类的vtable中。此时派生类vtable中的函数指向基类版本的函数地址。同时这个新的函数版本添加到派生类中,作为派生类的重载版本。但在基类指针实现多态调用函数方法时,这个新的派生类函数版本将会被隐藏。


这里“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,具体规则我们也来做一小结:
n          如果派生类的函数与基类的函数同名,但是参数不同。此时,若基类无virtual关键字,基类的函数将被隐藏。(注意别与重载混淆,虽然函数名相同参数不同应称之为重载,但这里不能理解为重载,因为派生类和基类不在同一名字空间作用域内。这里理解为隐藏)

n          如果派生类的函数与基类的函数同名,但是参数不同。此时,若基类有virtual关键字,基类的函数将被隐式继承到派生类的vtable中。此时派生类vtable中的函数指向基类版本的函数地址。同时这个新的函数版本添加到派生类中,作为派生类的重载版本。但在基类指针实现多态调用函数方法时,这个新的派生类函数版本将会被隐藏。

n          如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏。(注意别与覆盖混淆,这里理解为隐藏)。
n          如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数有virtual关键字。此时,基类的函数不会被“隐藏”。(在这里,你要理解为覆盖哦^_^)。

插曲:基类函数前没有virtual关键字时,我们要重写更为顺口些,在有virtual关键字时,我们叫覆盖更为合理些,戒此,我也希望大家能够更好的理解C++中一些微妙的东西。费话少说,我们举例说明吧。

 








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值