【C++】:C++中的继承权限和继承方式

这个很简单,就是Private都只能通过父类的函数去访问,其他的都跟随继承方式掉级就可以了,用的最多的还是public继承


C++继承的一般语法为:

class 派生类名:[继承方式] 基类名{
    派生类新增加的成员
};
继承方式限定了基类成员在派生类中的访问权限,包括 public(公有的)、private(私有的)和 protected(受保护的)。此项是可选的,如果不写,默认为 private 或 protected。

1) public继承方式
  • 基类中所有public成员在派生类中为public属性;
  • 基类中所有protected成员在派生类中为protected属性;
  • 基类中所有private成员在派生类中不可访问。

2) protected继承方式
  • 基类中的所有public成员在派生类中为protected属性;
  • 基类中的所有protected成员在派生类中为protected属性;
  • 基类中的所有private成员在派生类中仍然不可访问。

3) private继承方式
  • 基类中的所有public成员在派生类中均为private属性;
  • 基类中的所有protected成员在派生类中均为private属性;
  • 基类中的所有private成员在派生类中均不可访问。

由此可见:
  • 基类成员在派生类中的访问权限不得高于继承方式中指定的权限。例如,当继承方式为 protected 时,那么基类成员在派生类中的访问权限最高也为 protected,高于 protected 的会降级为 protected,但低于 protected 不会升级。
  • 基类中的 private 成员在派生类中始终是不可访问的。
private 继承限制太多,实际开发中很少使用,一般使用 public。
一个完整的例子:

    
    
  1. #include<iostream>
  2. using namespace std;
  3. //基类--Pelple
  4. class People{
  5. private:
  6. char *name;
  7. int age;
  8. public:
  9. void setName(char*);
  10. void setAge(int);
  11. void display();
  12. };
  13. void People::setName(char *name){ this->name = name; }
  14. void People::setAge(int age){ this->age = age; }
  15. void People::display(){ cout<<name<<"的年龄是 "<<age; }
  16. //派生类--Student
  17. class Student: public People{
  18. private:
  19. float score;
  20. public:
  21. Student(char*, int, float);
  22. void display1();
  23. };
  24. Student::Student(char *name, int age, float score){
  25. this->setName(name);
  26. this->setAge(age);
  27. this->score = score;
  28. }
  29. void Student::display1(){
  30. this->display();
  31. cout<<",成绩是 "<<score<<endl;
  32. }
  33. int main(){
  34. Student stu("小明", 15, 90.5);
  35. stu.display1();
  36. return 0;
  37. }
运行结果:
小明的年龄是 15,成绩是 90.5

读者要注意 Student 类的构造函数和 display1() 函数。在构造函数中,我们要设置 name、age、score 变量的值,但 name、age 在基类中被声明为 private,所以在 Student 中不可直接访问,只能借助基类中的成员函数 setName()、setAge() 来间接访问。

在 display1() 函数中,同样不能访问 People 类中 private 属性的成员变量,只能借助 People 类的成员函数来间接访问。

改变访问属性

使用 using 关键字可以改变基类成员在派生类中的访问属性,例如将 public 改为 private,或将 private 改为 public。

using 关键字使用示例:

    
    
  1. #include<iostream>
  2. using namespace std;
  3. class People{
  4. protected:
  5. char *name;
  6. int age;
  7. public:
  8. void say();
  9. };
  10. void People::say(){
  11. cout<<"你好,欢迎来到C语言中文网!"<<endl;
  12. }
  13. class Student: public People{
  14. private:
  15. using People::say; //改变访问属性
  16. public:
  17. using People::name; //改变访问属性
  18. using People::age;
  19. float score;
  20. void learning();
  21. };
  22. void Student::learning(){
  23. cout<<"我是"<<name<<",今年"<<age<<"岁,我学习非常努力,这次考了"<<score<<"分!"<<endl;
  24. }
  25. int main(){
  26. Student stu;
  27. stu.name = "小明";
  28. stu.age = 16;
  29. stu.score = 99.5f;
  30. stu.say(); //compile error
  31. stu.learning();
  32. return 0;
  33. }
代码中首先定义了基类 People,它包含两个 protected 属性的成员变量和一个 public 属性的成员函数。定义 Student 类时采用 public 继承方式,People 类中的成员在 Student 类中的访问权限默认是不变的。

不过,我们使用 using 改变了它们的默认访问权限,如代码第16~20行所示,将 say() 函数修改为 private 属性的,是降低访问权限,将 name、age 变量修改为 public 属性的,是提高访问权限。

因为 say() 函数是 private 属性的,所以代码第33行会报错。把该行注释掉,程序输出结果为:
我是小明,今年16岁,我学习非常努力,这次考了99.5分!

多级继承

实际开发中,经常会有多级继承的情况。例如,类A为基类,类B继承自类A,类C又继承自类B,那么类C也是类A的派生类,它们构成了多级继承的关系。如下图所示:


多级继承的规则与上面相同,这里仅举例说明。

    
    
  1. class A{ //基类
  2. public:
  3. int i;
  4. protected:
  5. void f2( );
  6. int j;
  7. private:
  8. int k;
  9. };
  10. class B: public A{ //public继承
  11. public:
  12. void f3( );
  13. protected:
  14. void f4( );
  15. private:
  16. int m;
  17. };
  18. class C: protected B{ //protected方式
  19. public:
  20. void f5( );
  21. private:
  22. int n;
  23. };
各成员在不同类中的访问属性如下:
 if2jkf3f4mf5n
基类A共有保护保护私有     
共有派生类B共有保护保护不可访问共有保护私有  
保护派生类C保护保护保护不可访问保护保护不可访问共有私有

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值