【C++】继承 ⑤ ( public 公有继承 - 示例分析 | protected 保护继承 - 示例分析 | private 私有继承 - 示例分析 )

250 篇文章 160 订阅


成员的访问属性 需要看根据下面的逻辑进行判定 :

  • 调用位置 : 看是在哪调用的 , 在 类内部 , 派生类 ( 子类 ) , 还是在 类外部 ;
  • 子类继承方式 :
    • 公有继承 : public
    • 保护继承 : protected
    • 私有继承 : private
  • 父类中的访问级别 :
    • 公有成员 : public
    • 保护成员 : protected
    • 私有成员 : private

如 : 在类外部调用 , 子类 保护继承 父类的 公有成员 , 调用失败 , 因为 父类的 公有成员 被 子类 保护继承 后 , 变为子类的 保护成员 , 只能在 子类内部 或 孙子类中调用 , 不可在类外部调用 ;

特别注意 : 私有继承 , 基类 的 公有成员 和 保护成员 变为 派生类的 私有成员 , 这两种成员在 派生类内部是可以访问的 , 在 类外部 不可访问 ;





一、public 公有继承 - 示例分析




1、public 公有继承


public 公有继承 : 父类成员 在 子类 中 , 访问控制权限 不变 , 共有 和 保护成员 可以在子类访问 , 私有成员不可在子类中访问 ;


父类中的访问控制权限 如下变化 :

  • 父类中的 public 成员 仍然是 public 成员 ;
  • 父类中的 protected 成员 仍然是 protected 成员 ;
  • 父类中的 private 成员 仍然是 private 成员 ;

2、代码示例 - public 公有继承


在下面的代码中 ,

基类 ( 父类 ) 中 , 定义了 公有变量 a , 保护变量 b , 私有变量 c ;


派生类 ( 子类 ) 中 , 分别访问了上述 3 个变量 ;

  • 访问 公有变量 a : 公有继承 基类 公有变量 在子类中仍是 共有变量 , 该变量可被访问 , 父类 公有成员 可以在任意位置访问 , 这里的任意位置指的是 类内部 , 子类内部 , 类外部 ;
        // 可访问 : 父类 公有成员 可以在任意位置访问
        // 任意位置 : 类内部 , 子类内部 , 类外部
        a = 0;
  • 访问 保护变量 b : 公有继承 基类 保护变量 在子类中仍是 保护变量 , 该变量在子类中是 保护成员 , 可以在 基类内部 和 子类内部访问 ;
        // 可访问 : 父类 保护成员 可以在 类内部 和 子类内部访问
        b = 0;
  • 访问 私有变量 c : 公有继承 基类 私有变量 在子类中仍是 私有变量 , 该变量是 子类 中的 私有成员 , 只能在 基类中访问 ;
        // 报错 : “Parent::c”: 无法访问 private 成员(在“Parent”类中声明)
        // 私有成员只能在本类中访问 , 子类 和 类外部无法访问
        //c = 0;

类外部访问 派生类 ( 子类 ) 继承的 3 个变量 ;

  • 访问 公有变量 a : 基类中的公有成员 , 公有继承 子类中仍是 公有成员 , 可以在类外部访问 ;
    // 基类中的公有成员
    // 公有继承 子类中仍是 公有成员 , 可以在类外部访问
    child.a;
  • 访问 保护变量 b : 基类中的保护成员 , 公有继承 子类中仍是 保护成员 , 不可在类外部访问 ;
    // 不可访问 : 基类中的保护成员
    // 公有继承 子类中仍是 保护成员 , 不可在类外部访问
    //child.b;
  • 访问 私有变量 c : 基类中的私有成员 , 公有继承 子类中仍是 私有成员 , 不可在类外部访问 ;
    // 不可访问 : 基类中的私有成员
    // 公有继承 子类中仍是 私有成员 , 不可在类外部访问
    //child.c;

代码示例 :

#include "iostream"
using namespace std;

class Parent {
public:
    int a;

protected:
    int b;

private:
    int c;
};

// 子类 公有继承 父类
class Child : public Parent {
public:
    void changeVar() {
        // 可访问 : 父类 公有成员 可以在任意位置访问
        // 任意位置 : 类内部 , 子类内部 , 类外部
        a = 0;

        // 可访问 : 父类 保护成员 可以在 类内部 和 子类内部访问
        b = 0;

        // 报错 : “Parent::c”: 无法访问 private 成员(在“Parent”类中声明)
        // 私有成员只能在本类中访问 , 子类 和 类外部无法访问
        //c = 0;
    }
};

int main() {

    Child child;
    child.changeVar();

    // 可访问 : 基类中的公有成员
    // 公有继承 子类中仍是 公有成员 , 可以在类外部访问
    child.a;

    // 不可访问 : 基类中的保护成员
    // 公有继承 子类中仍是 保护成员 , 不可在类外部访问
    //child.b;

    // 不可访问 : 基类中的私有成员
    // 公有继承 子类中仍是 私有成员 , 不可在类外部访问
    //child.c;
    

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}




二、protected 保护继承 - 示例分析




1、protected 保护继承


protected 保护继承 : 父类成员 在 子类 中 , 访问控制权限 变为 protected , 基类的 公有成员 和 保护成员 可以在子类访问 , 私有成员不可在子类中访问 ;


父类中的访问控制权限 如下变化 :

  • 父类中的 public 成员 变为 子类中的 protected 成员 ;
  • 父类中的 protected 成员 仍然是 protected 成员 ;
  • 父类中的 private 成员 仍然是 private 成员 ;

2、代码示例 - protected 保护继承


在下面的代码中 ,

基类 ( 父类 ) 中 , 定义了 公有变量 a , 保护变量 b , 私有变量 c ;


派生类 ( 子类 ) 中 , 分别访问了上述 3 个变量 ;

  • 访问 公有变量 a : 保护继承 基类 公有变量 在子类中 变为 保护变量 , 该变量可 在 派生类中 被访问 ;
        // 可访问 : 父类 公有成员 变为 保护成员
        // 可在 类内部 , 子类内部 访问该成员
        a = 0;
  • 访问 保护变量 b : 保护继承 基类 保护变量 在子类中仍是 保护变量 , 该变量在子类中是 保护成员 , 可以在 基类内部 和 子类内部访问 ;
        // 可访问 : 父类 保护成员 可以在 类内部 和 子类内部访问
        b = 0;
  • 访问 私有变量 c : 保护继承 基类 私有变量 在子类中仍是 私有变量 , 该变量是 子类 中的 私有成员 , 只能在 基类中访问 ,
        // 报错 : “Parent::c”: 无法访问 private 成员(在“Parent”类中声明)
        // 私有成员只能在本类中访问 , 子类 和 类外部无法访问
        //c = 0;

类外部访问 派生类 ( 子类 ) 继承的 3 个变量 ;

  • 访问 公有变量 a : 基类中的公有成员 , 保护继承 子类中 变成 保护成员 , 可以在类外部访问 ;
    // 不可访问 : 基类中的公有成员
    // 保护继承 子类中仍是 公有成员 , 可以在类外部访问
    //child.a;
  • 访问 保护变量 b : 基类中的保护成员 , 保护继承 子类中仍是 保护成员 , 不可在类外部访问 ;
    // 不可访问 : 基类中的保护成员
    // 保护继承 子类中仍是 保护成员 , 不可在类外部访问
    //child.b;
  • 访问 私有变量 c : 基类中的私有成员 , 保护继承 子类中仍是 私有成员 , 不可在类外部访问 ;
    // 不可访问 : 基类中的私有成员
    // 保护继承 子类中仍是 私有成员 , 不可在类外部访问
    //child.c;

代码示例 :

#include "iostream"
using namespace std;

class Parent {
public:
    int a;

protected:
    int b;

private:
    int c;
};

// 子类 保护继承 父类
class Child : protected Parent {
public:
    void changeVar() {
        // 可访问 : 父类 公有成员 变为 保护成员
        // 可在 类内部 , 子类内部 访问该成员
        a = 0;

        // 可访问 : 父类 保护成员 可以在 类内部 和 子类内部访问
        b = 0;

        // 报错 : “Parent::c”: 无法访问 private 成员(在“Parent”类中声明)
        // 私有成员只能在本类中访问 , 子类 和 类外部无法访问
        //c = 0;
    }
};

int main() {

    Child child;
    child.changeVar();

    // 不可访问 : 基类中的公有成员
    // 保护继承 子类中仍是 公有成员 , 可以在类外部访问
    //child.a;

    // 不可访问 : 基类中的保护成员
    // 保护继承 子类中仍是 保护成员 , 不可在类外部访问
    //child.b;

    // 不可访问 : 基类中的私有成员
    // 保护继承 子类中仍是 私有成员 , 不可在类外部访问
    //child.c;
    

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}




三、private 私有继承 - 示例分析




1、private 私有继承


private 私有继承 : 父类成员 在 子类 中 , 所有成员的访问控制权限 变为 private , 基类的 所有成员 都不可在子类中访问 ;


父类中的访问控制权限 如下变化 :

  • 父类中的 public 成员 变为 子类中的 private 成员 ;
  • 父类中的 protected 成员 变为 子类中的 private 成员 ;
  • 父类中的 private 成员 仍然是 private 成员 ;

2、代码示例 - private 私有继承


在下面的代码中 ,

基类 ( 父类 ) 中 , 定义了 公有变量 a , 保护变量 b , 私有变量 c ;


派生类 ( 子类 ) 中 , 分别访问了上述 3 个变量 ;

  • 访问 公有变量 a : 私有继承 基类 公有变量 在子类中 变为 子类的私有变量 , 父类中是公有成员 , 该变量可 在 派生类中 被访问 ;
        // 可访问 : 父类 公有成员 变为 子类 私有成员
        // 可在 子类内部 访问该成员
        a = 0;
  • 访问 保护变量 b : 私有继承 基类 保护变量 在子类中仍是 保护变量 , 该变量在子类中是 私有成员 , 父类中是保护成员 , 可以在 基类内部 和 子类内部访问 ;
        // 可访问 : 父类 保护成员 变为 子类 私有成员
        // 子类私有成员 可以在 子类内部访问
        b = 0;
  • 访问 私有变量 c : 私有继承 基类 私有变量 在子类中仍是 私有变量 , 该变量是 子类 中的 私有成员 , 只能在 基类中访问 ,
        // 报错 : “Parent::c”: 无法访问 private 成员(在“Parent”类中声明)
        // 私有成员只能在本类中访问 , 子类 和 类外部无法访问
        //c = 0;

类外部访问 派生类 ( 子类 ) 继承的 3 个变量 ;

  • 访问 公有变量 a : 基类中的公有成员 , 私有继承 子类中 变成 子类的私有成员 , 不可以在类外部访问 ;
    // 不可访问 : 基类中的 公有成员 变为 派生类 私有成员
    // 私有继承 子类中 的私有成员 , 不可在类外部访问
    //child.a;
  • 访问 保护变量 b : 基类中的保护成员 , 私有继承 子类中变为子类的 保护成员 , 不可在类外部访问 ;
    // 不可访问 : 基类中的 保护成员 变为 派生类 私有成员
    // 私有继承 子类中 的私有成员 , 不可在类外部访问
    //child.b;
  • 访问 私有变量 c : 基类中的私有成员 , 私有继承 子类中仍是 父类的私有成员 , 不可在类外部访问 ;
    // 不可访问 : 基类中的私有成员
    // 私有继承 子类中仍是 私有成员 , 不可在类外部访问
    //child.c;

代码示例 :

#include "iostream"
using namespace std;

class Parent {
public:
    int a;

protected:
    int b;

private:
    int c;
};

// 子类 私有继承 父类
class Child : private Parent {
public:
    void changeVar() {
        // 可访问 : 父类 公有成员 变为 子类 私有成员
        // 可在 子类内部 访问该成员
        a = 0;

        // 可访问 : 父类 保护成员 变为 子类 私有成员
        // 子类私有成员 可以在 子类内部访问
        b = 0;

        // 报错 : “Parent::c”: 无法访问 private 成员(在“Parent”类中声明)
        // 私有成员只能在本类中访问 , 子类 和 类外部无法访问
        //c = 0;
    }
};

int main() {

    Child child;
    child.changeVar();

    // 不可访问 : 基类中的 公有成员 变为 派生类 私有成员
    // 私有继承 子类中 的私有成员 , 不可在类外部访问
    //child.a;

    // 不可访问 : 基类中的 保护成员 变为 派生类 私有成员
    // 私有继承 子类中 的私有成员 , 不可在类外部访问
    //child.b;

    // 不可访问 : 基类中的私有成员
    // 私有继承 子类中仍是 私有成员 , 不可在类外部访问
    //child.c;
    

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}
  • 24
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 33
    评论
C++中,继承是一种面向对象编程的重要概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和行为。子类可以使用父类的成员变量和成员函数,并且可以添加自己的新成员变量和成员函数。 下面是继承的定义和示例代码: 定义: 1. 继承使用关键字`class`后跟着冒号和父类的名称进行定义。 2. 继承有三种类型:公有继承public inheritance)、私有继承private inheritance)和保护继承protected inheritance)。 3. 公有继承表示父类中的公有成员在子类中仍然是公有的,私有成员在子类中无法访问。 4. 私有继承表示父类中的公有成员在子类中变为私有的,私有成员在子类中无法访问。 5. 保护继承表示父类中的公有成员在子类中变为保护的,私有成员在子类中无法访问。 示例代码: ```cpp // 父类 class Shape { protected: int width; int height; public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } }; // 子类 class Rectangle : public Shape { public: int getArea() { return width * height; } }; int main() { Rectangle rect; rect.setWidth(5); rect.setHeight(10); int area = rect.getArea(); std::cout << "Area: " << area << std::endl; return 0; } ``` 在上述示例中,我们定义了一个父类`Shape`和一个子类`Rectangle`。子类`Rectangle`通过`public`关键字进行公有继承,表示子类可以访问父类的公有成员。 在`Rectangle`子类中,我们可以使用父类`Shape`的成员变量`width`和`height`,并且可以使用父类的成员函数`setWidth()`和`setHeight()`来设置这些成员变量的值。子类还添加了一个自己的成员函数`getArea()`,用于计算矩形的面积。 在`main()`函数中,我们创建了一个子类对象`rect`,并使用父类和子类的成员函数来设置宽度和高度,并计算矩形的面积。 继承提供了代码重用和扩展的能力,使得我们可以构建层次化的类结构,并在子类中添加新的功能。通过继承,子类可以继承父类的特性,并且可以进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值