C++ 关于重新定义成员函数的小问题

C++ 关于重新定义成员函数的小问题,c++,C++,我正在尝试从其父函数的定义中重新定义两个成员函数。我不知道是否正确,但我的代码中有一些附加错误,我无法找到原因。 标题部分: class Account { public: Account(double); void creditBalance(double); void debitBalance(double); double getBalance() const; protected: double balance; }; class Chec

我正在尝试从其父函数的定义中重新定义两个成员函数。
我不知道是否正确,但我的代码中有一些附加错误,我无法找到原因。

标题部分:

class Account 
{
public:
   Account(double);
   void creditBalance(double);
   void debitBalance(double);
   double getBalance() const;
protected:
   double balance;      
};


class CheckingAccount : public Account
{
public:
   CheckingAccount(double, double);
   void feeCreditBalance(double);
   void feeDebitBalance(double);

private:
   double fee = 10;

};
相关cpp文件部分:

void Account::creditBalance(double plus)
{
   if(plus > 0)
      balance += plus;
   else
      cout << "Cannot credit negative.";
}

void Account::debitBalance(double minus)
{
   if(minus <= balance)
      balance -= minus;
   else
      cout << "Debit amount exceeded account balance.";
}

void CheckingAccount::feeCreditBalance(double plus)
{
   if(plus > 0){
      balance += plus;
      balance -= fee;
   }
   else
      cout << "Cannot credit negative.";
}

void CheckingAccount::feeDebitBalance(double minus)
{
   if(minus <= balance){
      balance -= minus;
      balance -= fee;
   }
   else
      cout << "Debit amount exceeded account balance.";
}

现在我得到一个错误:虚拟类外声明

我可以用一个例子来说明如何正确地初始化费用

编辑2:

我已尝试将构造函数行更改为:

CheckingAccount::CheckingAccount(double initBal, double phi) :  Account(initBal), fee(phi)
{
   if(initBal < 0)
      initBal = 0;
   balance = initBal;
   cerr << "Initial balance was invalid.";

   if(phi < 0)
      phi = 0;
   fee = phi;
}
CheckingAccount::CheckingAccount(双初始余额,双phi):账户(初始余额),费用(phi)
{
如果(初始值<0)
initBal=0;
余额=初始余额;
cerr您需要学习成员函数(使用关键字)。如果您想更改基类成员函数实现,则需要重写这些方法,并在派生类中提供不同的实现

编辑:


这可能是您正在谈论的错误。用于初始化
费用
。您不能将
费用
初始化为类常量。

您不能就地初始化成员变量(双费=10)类似于此。您必须在派生类构造函数的初始化列表中进行初始化。还要注意,如果您使用的是继承,则应将基类析构函数设置为虚拟。

当您要重写父类中的方法时,应为该方法指定相同的名称。如果您希望该方法verride creditBalance。此外,如果希望调用creditBalance始终使用来自子类的方法,则需要在父类方法的定义中使用“virtual”关键字。

如果目的是为CheckingAccount帐户实例调用使用费用的版本,则需要使用虚拟方法

虚拟方法是一种标记为“virtual”的方法(至少在基类中是如此),并且在任何派生类中具有相同的名称和符号。当调用虚拟方法时,它将调用实例的“最派生”版本

要做到这一点,只需声明“void creditBalance(double);”和“void debitBalance(double);”virtual(即“virtual void creditBalance(double);”和“virtual void debitBalance(double);”和“virtual void debitBalance(double)”。然后在检查帐户时,将“feeditbbalance”和“feeDebitBalance”重命名为“creditBalance”和“debitBalance”

编辑:简单的例子

标题

class Base
{
public:
    Base(int x);
    //declare virtual so that derived classes may overide it
    virtual void sayHello();
protected:
    int x;
};

class Derived : public Base
{
public:
    Derived(int x, int y);
    //overide Base::sayHello(). the virtual keyword here is optional.
    virtual void sayHello();
protected:
    int y;
};
Cpp

Base::Base(int x)
:x(x)
{}
派生::Devired(整数x,整数y)
:底座(x),y(y)
{}
void Base::sayHello()
{

std::cout我认为费用应该是静态常数,如果它保持不变并且每个对象都不变化的话

在类中声明如下:

static const double fee;
const double ClassName::fee = 10;
像这样定义外部类:

static const double fee;
const double ClassName::fee = 10;
如果您希望您的实现不允许-Ve平衡,那么您还应该在继承中使用虚拟函数,这是一种更好的方法:

void CheckingAccount::feeCreditBalance(double plus)
{
    if(plus - fee > 0)
        balance += (plus - fee);
    else
        cout << "Cannot credit negative.";
}
void CheckingAccount::feeCreditBalance(双倍加)
{
如果(加上-费用>0)
余额+=(加-费用);
其他的


你可能会想使用虚拟成员函数。另外,你能发布你遇到的错误吗?它没有显示错误是什么,只是有错误。非常烦人。另外,我现在就试试。你有Account::balance的非虚拟getter和setter。Account::balance应该是私有的。这意味着什么呢?我是SUME你想调用派生类的FECERITITBACKE而不是信用平衡?哦,等等,不要C++。禁止ISO C++初始化成员的兴趣。“使兴趣”静态。禁止在类初始化非静态静态成员的兴趣“禁止init成员”FIE,实际上有两个子类,如果ONL,我该怎么办?有人想使用收费账户。问题是feeCreditBalance不是一种不同的方法。它是相同的方法,creditBalance,只是当账户类型是支票账户时,它也会减去费用。这不是一种不同的方法,它是同一方法的不同实现。更干净的设计是:void CheckingAcccount::creditBalance(double plus){if(plus>0){balance-=fee;}账户::creditBalance(plus);}这将尽可能地重用代码。如果另一个子类不需要方法的付费版本,它可以将该方法与父类分开。我在第二次阅读您的帖子时意识到虚拟方法是正确的,但我现在也有一个错误。此外,分配应该将贷项和借记项分开。奇怪,但我也可能会这样。如果只有一个子类需要“费”函数提供的功能,那么继承就不是正确的工具。继承用于对“is-a”进行建模关系,它不仅仅是一种将函数从一个类传递到另一个类的方法。查看composition.error:virtual-outer-class-declaration x2我不能做任何正确的事情。“virtual-void-Account::debitBalance(double-minus)”行的语法是否错误那么,将费用转移到父工作中会是什么情况呢?我将不得不阅读该页三次,才能找到与此相关的部分。您的初始化方法不正确。在派生类构造函数中初始化费用。是否只将双倍费用=10;添加到构造函数工作中?似乎不会对成员产生影响。您应该将费用初始化为:CheckingBalance::CheckingBalance(double,double):fee(10){}头讨厌这个。而且:fee(10)不适合:Account(initBal)fee是一个成员变量。您在CTor中声明了一个新的局部变量。使用fee=10;在CTor中或者更好地使用初始化列表:CheckingAccount():Account(initBal),fee(10){/*CTor body*/}您是否在帐户(initBal)和费用(10)之间添加了逗号?它应该默认为10,但仍然可以更改(费用)
void CheckingAccount::feeCreditBalance(double plus)
{
    if(plus - fee > 0)
        balance += (plus - fee);
    else
        cout << "Cannot credit negative.";
}