• 第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继承带来的复杂性远大于实用性

  • 相关阅读:
    SQL 列转行
    SQL 行转列
    ActionScript 3.0 学习笔记三
    VS 2010 添加扩展工具
    VS 2010 启动慢解决办法
    [SQL Server]游标示例
    SQL Server 2005 express TCP/IP 不能连接的配置
    FCKeditor.Net v2.6.3 上传图片的配置及注意事项
    HTTP/1.1 403 Forbidden
    存储过程中常使用的逻辑控制语句
  • 原文地址:https://www.cnblogs.com/-glb/p/11946207.html
Copyright © 2020-2023  润新知