【C++ 深入浅出】类的3种访问权限和3种继承方式详解

C++类的三种访问权限

  • 公共权限 public
    成员:类内可以访问,类外可以访问
    任何一种继承,子类可以访问父类的公共成员
  • 保护权限 protected
    成员:类内可以访问,类外不可以访问
    任何一种继承,子类可以访问父类的保护成员
  • 私有权限 private
    成员:类内可以访问,类外不可以访问。
    任何一种继承,子类不可以访问父类的私有成员

说明:
1)保护权限和私有权限在继承时会有区别,比如父亲的车可以作为保护成员,可以让儿子也使用,而父亲的私房钱应作为私有成员,儿子不能使用

2)成员函数一般定义在public中,为什么呢?因为你定义成保护或私有,类外是无法访问这个函数的,没什么意义,所以保护和私有一般放数据成员

示例:

#include <iostream>

using namespace std;

class Base {
public:    // 成员:类内可访问,类外可访问
    int m_A = 1; 
    void f() {
        cout << m_C << endl; 
    }
    
protected: // 成员:类内可访问,类外不可访问
    int m_B = 2; 
    void g() {
        m_C = m_B;
        cout << m_C << endl;
    }

private:   // 成员:类内可访问,类外不可访问
    int m_C = 3; 
};

int main() {
    Base p;
    // 类外可以访问public
    p.m_A = 13;
    p.f();
    
    // p.m_B = 24; // 类外不能访问protected
    // p.g();      // 类外不能访问protected
    // p.m_C = 45; // 类外不能访问private
    
    return 0;
}

继承方式: 公共继承、保护继承、私有继承

继承语法:class 子类 : 继承方式 父类
继承方式有三种:
公共继承、保护继承、私有继承

父类私有的部分不管是哪种继承方式,子类都无法访问(除非父类在public或protected中定义了访问私有内容的函数你才有可能访问到)

使用技巧:使用类成员时,只要清楚是在用什么权限的成员以及是在类内用还是在类外用,就一定不会出错

公有继承示例:

#include <iostream>

using namespace std;

class Base {
public:    // public成员:类内可访问,类外可访问
    int m_A = 1; 
    
protected: // protected成员:类内可访问,类外不可访问
    int m_B = 2;
    void g() { cout << m_C << endl; }

private:   // private成员:类内可访问,类外不可访问
    int m_C = 3; 
};

class Son1: public Base {
// public继承:相当于copy下面注释代码到Son1中,你不用自己写了,默认存在了

/*
public:    
    int m_A = 1; 
    
protected: 
    int m_B = 2;
    void g() { cout << m_C << endl; }

不可访问:   // 子类不能访问父类的私有成员,除非父类有其他接口,如g()
    int m_C = 3; 
*/

public:
    void sonf() {
        cout << m_A << " ";
        m_B = 51;
        g();
        // m_C = 43; // 注释代码说了不可访问
    }
private:
    int son1_m_A = 58;
};

int main() {
    Son1 s1;
    s1.sonf(); // 输出1 3
    
    return 0;
}

保护继承示例

class Son2: protected Base {
// protected继承:相当于copy下面注释代码到Son2中

/*
protected:    
    int m_A = 1; 
    
protected: 
    int m_B = 2;
    void g() { cout << m_C << endl; }

不可访问:   // 子类不能访问父类的私有成员,除非父类有其他接口,如g()
    int m_C = 3; 
*/

public:
    void sonf() {
        cout << m_A << " ";
        m_B = 51;
        g();
        // m_C = 43; // 注释代码说了不可访问
    }
private:
    int son2_m_A = 58;
};

私有继承示例

class Son3: private Base {
// private继承:相当于copy下面注释代码到Son3中

/*
private:    
    int m_A = 1; 
    
private: 
    int m_B = 2;
    void g() { cout << m_C << endl; }

不可访问:   // 子类不能访问父类的私有成员,除非父类有其他接口,如g()
    int m_C = 3; 
*/

public:
    void sonf() {
        cout << m_A << " ";
        m_B = 51;
        g();
        // m_C = 43; // 注释代码说了不可访问
    }
private:
    int son3_m_A = 58;
};

继承的技巧、一张图理解继承

使用技巧使用类成员时,只要清楚是在用什么权限的成员以及是在类内用还是在类外用,就一定不会出错

用一张图理解继承

补充:C++中class和struct的区别

C++中class和struct的唯一区别是:默认访问权限不同

  • C++ class默认权限是private
  • C++ struct默认权限是public

示例:

#include <iostream>

using namespace std;

class Person1{ // C++ class默认权限是private
    int age;
public:
    int a;
private:
    int b;
protected:
    int c;
};

struct Person2{ // C++ struct默认权限是public
    int age;
public:
    int a;
private:
    int b;
protected:
    int c;
};

int main() {
    Person1 p1; // class类 默认private
    Person2 p2; // struct类 默认public
    p1.age = 12; // wrong
    p2.age = 25; // right
    
    return 0;
}


写在最后:我的博客主要是对计算机领域所学知识的总结、回顾和思考,把每篇博客写得通俗易懂是我的目标,分享技术和知识是一种快乐 ,非常欢迎大家和我一起交流学习,有任何问题都可以在评论区留言,也期待与您的深入交流(^∀^●)

发布了270 篇原创文章 · 获赞 111 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_43827595/article/details/104422068