我试图在这个类中调用函数calculateInterest()

// account.h -- handles banking accounts
#ifndef ACCOUNT_H_
#define ACCOUNT_H_
#include <string>
using std::string;

class Account
{
private:
    double balance;
public:
    Account(double b = 0.0);
    double getBalance() {return balance;}
    void credit(double c);
    void debit(double d); 
};

class SavingsAccount : public Account
{
private:
    double rate;
public:
    SavingsAccount(double r = 0.0);
    double calculateInterest();
};



class CheckingAccount : public Account
{
private:
    double fee;
public:
    CheckingAccount(double f = 0.0);
    void credit(double m);
    void debit(double m);
};


#endif

到目前为止,我可以做Account joe(100); 然后使用Account类中的函数,所以我显然没有正确地继承它。

===============>>#1 票数:1

class Account
{
private:
    double balance;
public:
    Account(double b = 0.0);
    double getBalance() {return balance;}
    void credit(double c);
    void debit(double d);

    // add this!
    virtual double calculateInterest() = 0;
};

您需要在所有派生类中实现calculateInterest

===============>>#2 票数:1

您目前只有基类实例。 您不能使用它来调用派生类的方法。

如果您有派生类的实例,则可以使用它来调用派生类的方法。

SavingsAccount joe(100);
joe.calculateInterest();

由于这是派生类,您还可以调用credit()debit()

不相关:如果您打算使用多态,则应将creditdebit定义为虚函数。

===============>>#3 票数:1

1)您的所有函数都不是虚函数,因此派生类无法正确覆盖任何函数。

2)帐户joe(100)创建类Account的实例,而不是类SavingsAccount的实例。 如果要在joe上调用calculateInterest,则joe需要是SavingsAccount。 Account,SavingsAccount和CheckingAccount仍然是他们自己的唯一类。 SavingsAccount和CheckingAccount继承Account的数据和接口,但Account不继承他们的数据和接口。

3)如果你想将joe实例化为SavingsAccount但是将其作为一个账户进行存储和处理,那么你需要创建一个指向Account并指向它的指针,但如果你正在处理它,你将无法访问SavingsAccount函数像一个帐户。 在这种情况下,您需要将calculateInterest移动到Account(如果需要,将其设置为纯虚拟),然后在SavingsAccount中覆盖它。

class Account
{
  // Add this to your Account class
  virtual double calculateInterest() = 0;
};

class SavingsAccount : public Account
{
  // Add this to your SavingsAccount class
  double calculateInterest() override;
};

然后创建一个作为SavingsAccount的joe,但将其视为一个帐户:

SavingsAccount joe(100);
Account* pJoe = &joe;
double val = joe->calculateInterest();  // calculateInterest is available from Account, but because it's virtual, it calls the one from SavingsAccount.

如果您不想强制所有派生类实现此功能,那么您真的需要重新考虑整个设计。 在任何情况下,绕过它的一种廉价方法是使其非纯(从声明中删除= 0,但保留虚拟)并提供返回一些默认值的默认实现。

这是一个例子:

class Account
{
  // Add this
  virtual double calculateInterest() { return 0.0; }
};

class SavingsAccount : public Account
{
  // Add this
  double calculateInterest() override;  // and use your existing implementation
};

现在,如果您在SavingsAccount上调用calculateInterest,它将返回SavingsAccount的返回值。 如果在CheckingAccount上调用calculateInterest,它将返回Account提供的默认实现,即0.0。 如果您在一个指向SavingsAccount实例的Account *指针上调用calculateInterest,它将返回SavingsAccount的返回值,因为它是虚拟的。

  ask by user2292914 translate from so

未解决问题?本站智能推荐: