zoukankan      html  css  js  c++  java
  • 第45课 不同的继承方式

    被忽视的细节
    冒号(:)表示继承关系,Parent表示被继承的类,public的意义是什么?
    class Parent
    {

    };

    class Child : public Parent
    {

    };

    有趣的问题
    是否可以将继承语句中的public换成protected或者private?
    如果可以,与public继承有什么区别?

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Parent
    {
    };
    
    class Child_A : public Parent
    {
    };
    
    class Child_B : protected Parent
    {
    };
    
    class Child_C : private Parent
    {
    };
    
    int main()
    {   
        return 0;
    }

    上面的程序说明C++支持三种不同的继承方式。

    -public继承
      父类成员在子类中保持原有访问级别
    -private继承
      父类成员在子类中变为私有成员
    -protected继承
      父类中的公有成员变为保护成员,其它成员保持不变

     继承与访问级别的深度实践

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Parent
    {
    protected:
        int m_a;
    protected:
        int m_b;
    public:
        int m_c;
        
        void set(int a, int b, int c)
        {
            m_a = a;
            m_b = b;
            m_c = c;
        }
    };
    
    class Child_A : public Parent
    {
    public:
        void print()
        {
            cout << "m_a" << m_a << endl;
            cout << "m_b" << m_b << endl;
            cout << "m_c" << m_c << endl;
        }
    };
    
    class Child_B : protected Parent
    {
    public:
        void print()
        {
            cout << "m_a" << m_a << endl;
            cout << "m_b" << m_b << endl;
            cout << "m_c" << m_c << endl;
        }
    };
    
    class Child_C : private Parent
    {
    public:
        void print()
        {
            cout << "m_a" << m_a << endl;
            cout << "m_b" << m_b << endl;
            cout << "m_c" << m_c << endl;
        }
    };
    
    int main()
    {   
        Child_A a;
        Child_B b;
        Child_C c;
        
        a.m_c = 100;
        // b.m_c = 100;    // Child_B 保护继承自 Parent, 所以所有的 public 成员全部变成了 protected 成员, 因此外界无法访问
        // c.m_c = 100;    // Child_C 私有继承自 Parent, 所以所有的成员全部变成了 private 成员, 因此外界无法访问
        
        a.set(1, 1, 1);
        // b.set(2, 2, 2);
        // c.set(3, 3, 3);
        
        a.print();
        b.print();
        c.print();
        
        return 0;
    }

    遗憾的事实
    一般而言,C++工程项目中只使用public继承(在工程开发中要忘记protected继承和private继承)
    C++的派生语言只支持一种继承方式(public继承)
    protected 和private继承带来的复杂性远大于实用性

  • 相关阅读:
    asd
    自勉
    php cli 参数
    编译
    WebMisSharp的协同开发
    WebMisDeveloper4.5.0 基于Ext.net,Extjs,MVC/简单三层的自动生成开发利器
    WebMisDeveloper更新专版
    外设驱动库开发笔记37:S13365BQ光敏二极管作为光度计驱动
    Java学习笔记之多线程 生产者 消费者
    Java学习笔记之IO流&Properties集合
  • 原文地址:https://www.cnblogs.com/-glb/p/11946207.html
Copyright © 2011-2022 走看看