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

Posted

技术标签:

【中文标题】让基类的方法使用继承类的静态成员变量......可能吗?【英文标题】:Having a base class's method use inherited class's static member variable... possible? 【发布时间】:2015-10-19 19:56:26 【问题描述】:

基类:

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;

为了简单起见,我省略了不相关的成员/方法等。

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

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

我错过了什么吗?

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 是静态的,但我不确定最好的解决方案是什么。

【问题讨论】:

您是否将privateprotected 混淆了?另外,您为什么要隐藏APR 的定义?这会创建一个自变量。 @tadman 嗯,我还没有尝试过protected,但我会试一试。另外,我不确定您的意思是“掩盖定义”。 @KyleG。阴影意味着您不能从CheckingAccount 访问SavingsAccount::APR(没有明确指定范围),因为CheckingAccount 也有一个成员名称APR。虽然SavingsAccount::APR 是私有的,所以无论如何你都无法在SavingsAccount 之外访问它。 @zenith 啊,我就是这么想的。我最初设计 SavingsAccount 的目的是保持 APR 私有(在继承出现之前这很有意义),但回想起来这可能并不理想,因为 CheckingAccount 不能使用它...... 这完全取决于你的纪律水平和你的编码实践。一般来说,像这样的验证器是供外部使用的,任何编写子类的人都应该克制自己,避免弄乱内部。仅仅在所有东西上打private 会让你的代码写起来更烦人,子类感觉就像二等公民。权力越大,责任越大! 【参考方案1】:

我会建议一个不同的类层次结构:

class Account ;
class SavingsAccount : public Account ;
class CheckingAccount : public Account ;

然后,将virtual 成员函数添加到Account

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;

【讨论】:

我很欣赏这项工作,并且将来可能会使用这种方法,但在这种情况下,我不得不使用问题中描述的层次结构(这是一个作业) @KyleG.,您可以将virtual double getAPR(); 添加到SavingsAccount 吗? 我们还没有正式接触过virtual,所以很遗憾他不会允许。我仅限于已涵盖的语法和概念。 @KyleG.,很不幸。我为你感到伤心。我对你的导师失去了尊重。祝你上课顺利。 有些学生甚至没有正确的心态开始学习如何编程,而其他学生已经在那里等待更多。他们将每个人都投入同一个课程的方式与在半个班级甚至无法阅读时尝试教授英语文学没什么不同。

以上是关于让基类的方法使用继承类的静态成员变量......可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++中子类从基类都继承啥?

JAVA基础--继承

DLL-导出模板基类的静态成员

c#核心基础--类的继承

java中私有的属性、静态成员可以被子类继承吗?

Java中类的继承与权限控制