让基 class 的方法使用继承的 class 的静态成员变量......可能吗?

Having a base class's method use inherited class's static member variable... possible?

基础class:

class SavingsAccount
{
public:
    void AddInterest();  // add interest to balance based on APR (interest rate)
private:
    static double APR;
    double Balance;
}

class CheckingAccount: public SavingsAccount
{
private:
    static double APR;
}

为简单起见,我省略了不相关的 members/methods 等。

所以,情况是这样的:CheckingAccount 应该和 SavingsAccount 一样,但是它应该有不同的 APR(利率)。所有 SavingsAccounts 共享相同的 APR,所有 CheckingAccounts 共享他们自己的 APR(因此变量是静态的)。这是一个赋值,我们应该为 APRs.

使用静态成员变量

根据我的研究和测试,我似乎无法找到任何方法来覆盖 CheckingAccount class 中的 AddInterest() 方法以使其使用 CheckingAccount::APR。如果是这种情况,那么 SavingsAccount 中的大多数方法将不得不被覆盖,因为许多方法使用 APR,这似乎扼杀了学习继承 class 的意义。

我是不是漏掉了什么?

AddInterest()方法,供参考:

SavingsAccount::AddInterest()
{
    double interest = (this->APR/100)/12 * this->getBalance();
    this->setBalance(this->getBalance() + interest);
}

编辑:我 运行 进入的原始问题(在 CheckingAccount 中覆盖 APR 之前)如下:

int main()
{
    SavingsAccount sav;
    CheckingAccount chk;

    sav.setAPR(0.2);
    chk.setAPR(0.1);

    cout << sav.getAPR() << endl;  // OUTPUTS "0.1"!!

    return 0;
}

修改 CheckingAccount 个对象的 APR 会修改 SavingsAccount 个对象的 APR!这对我来说很有意义,因为 APR 是静态的,但我不确定最好的解决方案是什么。

我建议使用不同的 class 层次结构:

class Account {};
class SavingsAccount : public Account {};
class CheckingAccount : public Account {};

然后,向Account添加一个virtual成员函数:

virtual double getAPR() = 0;

然后,使用 getAPR().

实现 Account::AddInterest()
class Account
{
   public:

      virtual ~Account() {}

      // Add other functions as needed
      // ...

      void AddInterest()
      {
         // Implement using getAPR()
         double interest = (this->APR/100)/12 * this->getBalance();
         this->setBalance(this->getBalance() + interest);
      }
      virtual double getAPR() = 0;

   private:
      double Balance;
};

class SavingsAccount : public Account
{
   public:
      virtual double getAPR() { return APR; }
   private:
      static double APR;
}

class CheckingAccount : public Account
{
   public:
      virtual double getAPR() { return APR; }
   private:
      static double APR;
}