继承/多态性 - 我是否被迫使用"protected"变量?
Inheritance/Polymorphism - Am I forced to use "protected" variables?
我目前正在使用 Big C++ 第 2 版,使用 Code::Blocks 17.12,关于继承的章节
本书介绍了受保护的变量类型,用于您希望允许派生类访问所述变量的情况。
该书还警告说,受保护的元素会遭受公共变量的一些缺陷:在最坏的情况下,派生类成员可能会损坏基类数据
本书在专门的一节中演示了在时钟程序中使用受保护成员,并在其中介绍了这一点,但在最终代码中,他们最终将变量设置为私有,然后使用一些get_辅助函数来访问这些私有数据。这种私有函数和使用帮助程序函数的组合总是在我的 IDE 中返回错误,我无法做到这一点
以我为 P8.1创建的这个简单示例为例,P8.1 是程序员的员工记录,其中包含员工基类和程序员派生类。我创建了以下 ctor,在基类中将变量名称和 sal 设置为受保护状态
Programmer::Programmer(string p_name, double p_sal)
:Employee(get_name(), get_sal())
{
name=p_name;
sal=p_sal;
}
使用此代码,程序可以完美运行。
根据教科书,如果变量 name 和 sal 在数据库中设置为私有状态,那么我也应该能够执行代码,前提是我正在使用我创建的 get_ 辅助函数来访问数据。
谁能解释一下这里的问题是什么?我应该接受使用受保护的还是真的有办法让我的所有变量都对类保密?
我也在 https://learn.microsoft.com/en-us/cpp/cpp/protected-cpp?view=vs-2019 上发现了这个
派生类的任何友元或成员函数都可以访问也声明为静态的受保护成员。 派生类中的友元和成员函数只能通过指向派生类的指针、引用派生类或派生类的对象来访问未声明为静态的受保护成员。
到目前为止,我还没有介绍静态,所以我最终尝试了一堆不同的指针和引用组合,这些组合都不起作用。
我试图了解何时使用受保护与何时使用私有基本上,但这本书对此并不清楚。有什么想法吗?
出于某种原因,我认为在调用基类构造函数时,您需要提供辅助函数来访问私有数据。
由于基本 ctor 已经是公共的,并且通过向它提供派生类 ctor 的参数,它将正确构造派生类 obj,允许 get_ func 读取其私有变量
Programmer::Programmer(string p_name, double p_sal)
:Employee(p_name, p_sal)
{}
我在书中没有理解这一点,谢谢大家帮助澄清
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 通过多个头文件使用常量变量
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- 在不使用“protected”的情况下,子类如何有效地使用基类中定义的变量