zoukankan      html  css  js  c++  java
  • C++ 公有继承、保护继承和私有继承的对比

    在c++的继承控制中,有三种不同的控制权限,分别是public、protected和private。定义派生类时,若不显示加上这三个关键字,就会使用默认的方式,用struct定义的类是默认public继承,class定义的类是默认private继承。这和Java有很大的不同,Java默认使用public继承,而且只有公有继承。

            1.使用public继承时,派生类内部可以访问基类中public和protected成员,但是类外只能通过派生类的对象访问基类的public成员。
            (1)基类的public成员在派生类中依然是public的。
            (2)基类中的protected成员在派生类中依然是protected的。
            (3)基类中的private成员在派生类中不可访问。
            2.使用protected继承时,派生类内部可以访问基类中public和protected成员,并且类外也不能通过派生类的对象访问基类的成员(可以在派生类中添加公有成员函数接口间接访问基类中的public和protected成员)。
            (1)基类的public成员在派生类中变为protected成员。
            (2)基类的protected成员在派生类中依然是protected成员。
            (3)基类中的private成员在派生类中不可访问。
           3.使用private继承时,派生类内部可以访问基类中public和protected成员,并且类外也不能通过派生类的对象访问基类的成员(可以在派生类中添加公有成员函数接口间接访问基类中的public和protected成员)。
            (1)基类的public成员在派生类中变成private成员。
            (2)基类的protected成员在派生类中变成private成员。
            (3)基类的private成员在派生类中不可访问。
            为了便于理解,我们用一个表格来说明这几种控制符使用的情况:

     

    派 生 方 式  基类的public成员 基类的protected成员 基类的private成员
    public派生 还是public成员 变成protected成员    不可见
    protected派生 变成protected成员    变成protected成员    不可见
    private派生 变为private成员 变为private成员 不可见
    #include<iostream> 
    #include<cstdio>
    using namespace std;
    
    class Biological{
    public:
        string property;
        virtual void prop(){
            cin>>property;
            cout<<"property:"<<property<<endl;
        }    
    
    private:  // c++默认权限为private
        string name;
        void species(){
            cin>>name;
            cout<<"name:"<<name<<endl;
        }
    
    protected:
        string belong;
        void bel(){
            cin>>belong;
            cout<<"belong:"<<belong<<endl;
        }
    };
    
    class Animal:public Biological{// 公有继承
    public:
        void display(){
            prop();
            bel();
            //species();  // error: ‘void Biological::species()’ is private 
        }
    };
    
    class Plant:private Biological{  // 私有继承为默认可以省略
    public:
        void display(){
            prop();
            bel();
            //species();  // error: ‘void Biological::species()’ is private
        }
    };
    
    class Both:protected Biological{  // 私有继承
    public:
        void display(){
            prop();
            bel();
            //species();  // error: ‘void Biological::species()’ is private
        }
    };
    
    void animalDis(){
        Animal animal;
        animal.display();
        animal.property="cat";
        cout<<"修改animal.property为:"<<animal.property<<endl;
        // animal.name="xiaohei";  // error: ‘std::__cxx11::string Biological::name’ is private
        // cout<<"animal.name"<<animal.name<<endl;
        // animal.belong="animal";  // error: ‘std::__cxx11::string Biological::belong’ is protected
        // cout<<"animal.belong"<<animal.belong<<endl;
    }
    
    void plantDis(){
        Plant plant;
        plant.display();
        // plant.property="tree";  // error: ‘std::__cxx11::string Biological::property’ is inaccessible
        // cout<<"修改plant.property为:"<<plant.property<<endl;
        // plant.name="poplar";  //error: ‘std::__cxx11::string Biological::name’ is private
        // cout<<"修改plant.name为:"<<plant.name<<endl;
        // plant.belong="plant";  //error: ‘std::__cxx11::string Biological::belong’ is protected
        // cout<<"修改plant.belong为:"<<plant.belong<<endl;
    }
    
    void bothDis(){
        Both both;
        both.display();
        // both.property="tree";  // error: ‘std::__cxx11::string Biological::property’ is inaccessible
        // cout<<"修改both.property为:"<<both.property<<endl;
        // both.name="poplar";  // error: ‘std::__cxx11::string Biological::name’ is private
        // cout<<"修改both.name为:"<<both.name<<endl;
        // both.belong="plant";  // error: ‘std::__cxx11::string Biological::belong’ is protected
        // cout<<"修改both.belong为:"<<both.belong<<endl;
    }
    
    int main(){
        animalDis();
        plantDis();
        bothDis();
        return 0;
    }


    ————————————————
    版权声明:本文为CSDN博主「扮猪吃饺子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_28712713/article/details/80967650

  • 相关阅读:
    使用 OpCache 提升 PHP 性能
    在线视频开发博客教程
    修正ECMALL在PHP5.3以上版本中无法开启支付方式的BUG
    第二个小项目的讲解后感言
    mybatis进行分页,使用limit
    mybatis传递多个参数值(转)
    一个关于前端页面的小标签<tbody>
    json-lib的一些过滤操作
    关键字volidate和transient(转)
    Java中实现序列化的两种方式 Serializable 接口和 Externalizable接口
  • 原文地址:https://www.cnblogs.com/ligei/p/11457247.html
Copyright © 2011-2022 走看看