【问题标题】:Using a static member from a derived class instead of the base class使用派生类的静态成员而不是基类
【发布时间】:2020-05-22 19:17:19
【问题描述】:

如上所述,我正在尝试创建一个名为 increment_rate 的静态变量名称,它的所有 Employee 类的默认值都是 1.05。

但是,Developer 类(派生自 Employee 类)享有 1.10 的默认 increment_rate(对程序员来说是好事)。

在 Employee 类中,我有一个名为 apply_incr() 的公共方法。每当我调用它时,标准员工(例如基类 Employee,或其他子类,例如 Clerk 或 Janitor)仅享有标准的 increment_rate 1.05,而子类 Developer 应该自动享受 1.10。

在python中,如果基类和派生类都有变量increment_rate,方法解析顺序会默认自动选择派生类的increment_rate。 但是在 C++ 中,我将如何实现这样一个类似的功能,以便它会自动为开发人员应用 1.10,而其他人只能获得 1.05?

因为所有 Clerk 或所有 Janitor 或所有 Employee 都具有相同的 1.05 比率,这就是为什么我选择使用类范围内使用的静态成员,而不是类的每个实例唯一的普通成员。

谢谢!

【问题讨论】:

  • C++ 不是 Python,如果是 Python,它就不会被称为 C++。在 C++ 中,您不能拥有动态解析为正确类的静态变量。您需要创建一个返回所需值的虚函数,并在 Python 中使用变量时使用它。您将需要覆盖每个派生类中的函数。该函数可以从静态变量中获取值,这没有错。

标签: c++ static method-resolution-order


【解决方案1】:

我不确定为什么需要静态变量。假设 apply_incr() 不是静态的,您可以这样:

class Employee {

public:
    virtual double getIncrementRate() const { return 1.05; }
}

class Developer : Employee {

public:
    virtual double getIncrementRate() const override { return 1.10; }
}

【讨论】:

  • 注意:当你明确地说override(好)时,同时说virtual只是多余的噪音。只需double getIncrementRate() const override { return 1.10; } 就足够了。
  • @JesperJuhl 虽然我同意这个原则,但这一切都归结为你所从事的项目的编码约定。
  • 感谢 AlexG!我马上试试。我想到静态变量的原因主要是因为我想使用一个在同一类的所有实例中都标准化的变量(因此我的大脑开始只朝那个方向思考)。我从来没有想过使用一种方法来返回一个特定的值。在那条线上,我也不知道虚函数或 const (和覆盖)的用法,所以我也要学习那些关键字/方法。再次感谢!
  • 感谢 Jesper Juhl,我会注意到 virtual 是可选的可能性。希望通过更多的学习和实验,我将能够看到哪个更适合我将来想做的事情。谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 2018-11-30
  • 1970-01-01
  • 2016-10-15
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多