继承/多态性 - 我是否被迫使用"protected"变量?

Inheritance/Polymorphism - Am I forced to use "protected" variables?

本文关键字:protected 变量 被迫 多态性 是否 继承      更新时间:2023-10-16

我目前正在使用 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)
{}

我在书中没有理解这一点,谢谢大家帮助澄清