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

posted @ 2018-02-26 22:16  Tattoo_Welkin  阅读(198)  评论(0编辑  收藏  举报