• 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++中的覆盖与隐藏

  • 相关阅读:
    阶段性总结(PHP-JSON)
    阶段性总结(PHP-Array函数)
    JavaScript异步加载的三种方式——async和defer、动态创建script
    event.target 和 event.currentTarget 的区别
    面试题:常用的http状态码
    JS变量重复声明以及忽略var 声明的问题及其背后的原理
    line-height:1.5和line-height:150%的区别
    Web前端性能优化——如何提高页面加载速度
    Promise和setTimeout执行顺序 面试题
    过目不忘JS正则表达式
  • 原文地址:https://www.cnblogs.com/Tattoo-Welkin/p/10335303.html
Copyright © 2020-2023  润新知