C++继承之隐藏

1.隐藏的基本概念

什么是隐藏 ?就是说在下面的这种情况下,父类的ABC会在子类中进行隐藏,但是子类的确继承了父类的ABC函数 。如果一定要使用父类中的ABC,那么必须进行特殊处理。

这里写图片描述

(1)成员函数的隐藏

#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Person{
public:
    Person(){
        name = "父类初始化" ;
    } 
    void play() {
        name = "由父类 Person 设置 "  ;
        cout << "Person 中的 play 函数 " << endl ;
    }
protected:
    string name ;
};

class Worker : public Person
{
public:
    Worker() = default ;
    void play(){
        name = "由子类 Worker 设置 "  ;
        cout << "Worker 中的 play 函数 " << endl ;
    }
    void print(){
        cout << "name == " << name  << endl; 
    }
protected:
};
int main(void){
    Worker work1 ;
    work1.play() ; //这样调用的是子类中的play 函数
    work1.print();

    cout << "--------------------------------------------------------"<<  endl ;

    work1.Person::play();  //这样调用的是父类中的play 函数,且必须这样调用
    work1.print();
    return 0 ;
}
运行结果:

这里写图片描述

值得一提的是:
  1. 如果父类与子类中的函数参数类型与个数不相同,也会发生隐藏现象,也就是说不会发生重载 。
  2. 必须使用这种写法去调用父类隐藏的成员函数“work1.Person::play(); ”
  3. 当然了,说了这麽多,又有谁会去这样去设计代码呐,切~

(2)数据成员变量的隐藏

#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Person{
public:
    Person(){
        name = "父类初始化" ;
    } 
    void Person_print() {
        cout << "In   Person_print name == " << name  << endl; 
    }
protected:
    string name ;
};

class Worker : public Person
{
public:
    Worker() = default ;
    void play_in_Worker(string Worker_str){
        name = Worker_str  ; //一直改变的是Worker 中的name ,那么如何改变Person 中的name 呐?????
        cout << "Worker 中的 play 函数 " << endl ;
    }
    void print(){
        cout << "In Worker  name == " << name  << endl; 
    }
protected:
    string name ;  // 与父类数据成员同名
};
int main(void){
    Worker work1 ;
    work1.play_in_Worker("liu") ; 
    work1.print();
    work1.Person_print();


    cout << "--------------------------------------------------------"<<  endl ;

    work1.play_in_Worker("sheng") ; 
    work1.print();
    work1.Person_print();

    return 0 ;
}
运行结果:

这里写图片描述

改进:


#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Person{
public:
    Person(){
        name = "父类初始化" ;
    } 
    void Person_print() {
        cout << "In   Person_print name == " << name  << endl; 
    }
protected:
    string name ;
};

class Worker : public Person
{
public:
    Worker() = default ;
    void play_in_Worker(string Worker_str,string Person_str){
        name = Worker_str  ; 
        Person::name = Person_str ; // 就 这 样 做 
        cout << "Worker 中的 play 函数 " << endl ;
    }
    void print(){
        cout << "In Worker  name == " << name  << endl; 
    }
protected:
    string name ;  // 与父类数据成员同名
};
int main(void){
    Worker work1 ;
    work1.play_in_Worker("liu","555") ; 
    work1.print();
    work1.Person_print();


    cout << "--------------------------------------------------------"<<  endl ;

    work1.play_in_Worker("sheng","666") ; 
    work1.print();
    work1.Person_print();

    return 0 ;
}
运行结果:

这里写图片描述

为什么需要名字隐藏机制
C++中的覆盖与隐藏

转载于:https://www.cnblogs.com/Tattoo-Welkin/p/10335303.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值