关于c++的protected关键字

分类

c++基础知识

引言

做了很业务,c++基础知识却忘了很多,今天看了一个例子,唤醒了我关于c++三大特性之一----封装,尘封的记忆。。。

例子

1)错误的demo

错误发生在main函数中…
请添加图片描述

#include <iostream>  
#include <memory> // 引入智能指针的头文件  
  
using namespace std;  
  
// 操作基类  
class Operate {  
public:  
    Operate() {}  
    virtual ~Operate() {}  
      
    virtual int GetResult() = 0; // 纯虚函数,强制派生类实现  
  
protected:  
    int NumsA, NumsB;  
};  
  
// 加法操作类  
class AddOperate : public Operate {  
public:  
    int GetResult() override {  
        return NumsA + NumsB;  
    }  
};  
  
// 减法操作类  
class SubOperate : public Operate {  
public:  
    int GetResult() override {  
        return NumsA - NumsB;  
    }  
};  
  
// 乘法操作类  
class MulOperate : public Operate {  
public:  
    int GetResult() override {  
        return NumsA * NumsB;  
    }  
};  
  
// 除法操作类  
class DivOperate : public Operate {  
public:  
    int GetResult() override {  
        if (NumsB == 0) {  
            throw runtime_error("Division by zero is not allowed.");  
        }  
        return NumsA / NumsB;  
    }  
};  
  
// 操作工厂类  
class OperateFactory {  
public:  
    OperateFactory() {}  
      
    std::unique_ptr<Operate> CreateOperate(char op) {  
        switch (op) {  
            case '+': return std::make_unique<AddOperate>();  
            case '-': return std::make_unique<SubOperate>();  
            case '*': return std::make_unique<MulOperate>();  
            case '/': return std::make_unique<DivOperate>();  
            default:  
                throw runtime_error("No such operation!");  
        }  
    }  
};  
  
int main() {  
    try {  
        OperateFactory factory;  
        char op = '+';  
        int numA = 100, numB = 700;  
          
        std::unique_ptr<Operate> operate = factory.CreateOperate(op);  
        operate->NumsA = numA;  
        operate->NumsB = numB;  
          
        cout << operate->GetResult() << endl;  
    } catch (const exception& e) {  
        cout << "Error: " << e.what() << endl;  
    }  
      
    return 0;  
} 
  • 报错:
    在这里插入图片描述
  • 报错的原因:
    protected修饰的成员变量,只能是类内的成员函数可以访问,类外直接访问不了

进一步解释:NumsA和NumsB 是 protected修饰的成员变量,
只能是在Operate类内使用(他的派生类内也是可以使用的),
所以你需要再Operate 类中使用set函数将其进行封装,
这样你在类外就可以使用了(main函数就是Operate 类的类外,别的类中成员函数也是Operate的类外)
所以说,set函数就是封装.

当你下次再和面试,在和面试官进行社交的时候,讨论C++三大特性之一—封装的时候,
你就可以这么大胆的说:
c++封装就是 将一组有一定关系的变量和函数有机结合在一起.
然后假如你用protected关键字规定了一组成员变量,那么这组成员变量只能在类内的成员变量中访问,
而类外,比如main函数,或者别的类中的成员函数,都是不能直接访问的,我们需要在该类中,编写一组set函数,对protected成员变量进行封装,这样类外通过访问set函数,而不是直接访问成员变量,也是封装中比较明显的一个特征.

非常好!我要是面试官,我必定当场录取你!

2)改正的demo

从上面得知,protected修饰的成员变量是不能直接在类外访问的,只能在类内访问.
既然只能在类内访问,那我们就只在类内种访问不就ok了?
我们直接给他安排一组set函数,
然后让类外通过set函数访问就可以了!!!

#include <iostream>  
#include <memory> // 引入智能指针的头文件  

using namespace std;

// 操作基类  
class Operate {
public:
    Operate() {}
    virtual ~Operate() {}

    virtual int GetResult() = 0; // 纯虚函数,强制派生类实现  
    void  SetNumsA(int A)
    {
        NumsA = A;
    }
    void SetNumsB(int B)
    {
        NumsB = B;
    }
protected:
    int NumsA, NumsB;
};

// 加法操作类  
class AddOperate : public Operate {
public:
    int GetResult() override {
        return NumsA + NumsB;
    }
};

// 减法操作类  
class SubOperate : public Operate {
public:
    int GetResult() override {
        return NumsA - NumsB;
    }
};

// 乘法操作类  
class MulOperate : public Operate {
public:
    int GetResult() override {
        return NumsA * NumsB;
    }
};

// 除法操作类  
class DivOperate : public Operate {
public:
    int GetResult() override {
        if (NumsB == 0) {
            throw runtime_error("Division by zero is not allowed.");
        }
        return NumsA / NumsB;
    }
};

// 操作工厂类  
class OperateFactory {
public:
    OperateFactory() {}

    std::unique_ptr<Operate> CreateOperate(char op) {
        switch (op) {
        case '+': return std::make_unique<AddOperate>();
        case '-': return std::make_unique<SubOperate>();
        case '*': return std::make_unique<MulOperate>();
        case '/': return std::make_unique<DivOperate>();
        default:
            throw runtime_error("No such operation!");
        }
    }
};

int main() {
    try {
        OperateFactory factory;
        char op = 'z';
        int numA = 100, numB = 700;

        std::unique_ptr<Operate> operate = factory.CreateOperate(op);
        operate->SetNumsA(numA);
        operate->SetNumsB(numB);

        cout << operate->GetResult() << endl;
    }
    catch (const exception& e) {
        cout << "Error: " << e.what() << endl;
    }

    return 0;
}

protected在c++中的含义与作用

不多写了,多写也记不住,前言万语总结成一句话:

protected:当一个成员被定义为protected类型时,仅能在类内、友元和派类访问。

最后祝每个大佬都可以月薪过万! 加油!

相关推荐

  1. C++关键字const

    2024-03-13 07:34:02       25 阅读
  2. C# this关键作用

    2024-03-13 07:34:02       54 阅读
  3. C#中“ref“关键使用

    2024-03-13 07:34:02       47 阅读
  4. C语言32个关键

    2024-03-13 07:34:02       33 阅读
  5. C++ explicit关键用法

    2024-03-13 07:34:02       69 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-13 07:34:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-13 07:34:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-13 07:34:02       82 阅读
  4. Python语言-面向对象

    2024-03-13 07:34:02       91 阅读

热门阅读

  1. 软件工程---原型评价

    2024-03-13 07:34:02       39 阅读
  2. iOS 17.4报错: libopencore-amrnb.a[arm64]

    2024-03-13 07:34:02       44 阅读
  3. 人工智能领域从原理详细总结chatgpt的prompt方法

    2024-03-13 07:34:02       45 阅读
  4. html5&css&js代码 013 常见布局

    2024-03-13 07:34:02       43 阅读
  5. 使用docker搭建chromium

    2024-03-13 07:34:02       45 阅读
  6. linux系统docker容器编写dockerfile文件

    2024-03-13 07:34:02       46 阅读
  7. JVM相关

    2024-03-13 07:34:02       40 阅读
  8. flink状态后端和检查点的关系

    2024-03-13 07:34:02       49 阅读
  9. 【嵌入式DIY实例】-DIY锂电池电压检测表

    2024-03-13 07:34:02       45 阅读
  10. 字节一面:TCP 和 UDP 可以使用同一个端口吗?

    2024-03-13 07:34:02       39 阅读