c++继承之隐藏

本文介绍了C++中的隐藏概念,即派生类的函数如何屏蔽同名的基类函数。通过代码实例展示了隐藏的效果,解释了如何在子类中调用被隐藏的父类函数。同时,文章还区分了隐藏与覆盖(重写)的区别,强调隐藏的成员并未消失,可通过特定方式访问,而覆盖则涉及到虚函数表的更新。

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

隐藏

概念:

隐藏是指派生类的函数屏蔽了与其同名的基类函数。

代码实例:

#include <iostream>
using namespace std;
class Person
{
public:
    Person(){
        cout<<"Person的构造函数"<<endl;
    }
    ~Person(){
        cout<<"Person的析构函数"<<endl;
    }
    void eat(){
        cout<<"Person的eat函数"<<endl;
    }
private:
    int m_iAge;
    string m_strName;
};
class Worker :public Person
{
public:
    Worker(){
        cout<<"Worker的构造函数"<<endl;
    }
    ~Worker(){
        cout<<"Worker的析构函数"<<endl;
    }
    void eat(){
        cout<<"Worker的eat函数"<<endl;
    }
    void work(){
        cout<<"Worker的work函数"<<endl;
    }
private:
    int m_iSalary;
};
int main()
{
    Worker w;
    w.eat();
    w.Person::eat();
    return 0;
}

运行结果为:

Person的构造函数
Worker的构造函数
Worker的eat函数
Person的eat函数
Worker的析构函数
Person的析构函数

--------------------------------
Process exited after 0.1206 seconds with return value 0
请按任意键继续. . .

简易解释

  • Worker是子类,Person是父类,我们在栈上实例化子类方法,首先调用父类构造函数,其次调用子类构造函数。析构函数则反之,并且栈上的空间是由系统管理,系统调用析构函数。
  • 父类中的eat()函数被隐藏,w.eat()调用的是子类的eat()函数。
  • 如果我们需要调用父类的成员函数,可以采用w.Person::eat();的方法。

几个易混淆的名词

  • 隐藏:
    不解释了
  • 覆盖或者称之为重写(override)
    如果我们没有在子类中定义同名的虚函数,那么在子类虚函数表当中就会写上父类当中那个虚函数的函数入口地址,如果我们在子类中也定义了同名的虚函数,那么在子类的虚函数表当中,我们就会把原来父类的虚函数的函数地址覆盖一下,覆盖成子类的虚函数的函数地址。
  • 如何记忆
    隐藏并没有消失,可以通过特殊的手段访问,数据成员也有隐藏这种现象。而覆盖则是在子类的虚函数表当中,我们就会把原来父类的虚函数的函数地址覆盖一下,覆盖成子类的虚函数的函数地址。(后续会有博客详细解释)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖头鱼爱算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值