【C++ 深入浅出】类的3种访问权限和3种继承方式详解
文章目录C++类的三种访问权限继承方式: 公共继承、保护继承、私有继承继承分析技巧补充:C++中class和struct的区别C++类的三种访问权限公共权限 public成员:类内可以访问,类外可以访问保护权限 protected成员:类内可以访问,类外不可以访问,子类可以访问父类的保护成员私有权限 private成员:类内可以访问,类外不可以访问,子类不可以访问父类的私有成员...
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;
}
写在最后:我的博客主要是对计算机领域所学知识的总结、回顾和思考,把每篇博客写得通俗易懂是我的目标,分享技术和知识是一种快乐 ,非常欢迎大家和我一起交流学习,有任何问题都可以在评论区留言,也期待与您的深入交流(^∀^●)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)