C++ C++;

C++ C++;,c++,polymorphism,C++,Polymorphism,我有四门课,银行、账户、储蓄和支票。储蓄和支票都是从帐户公开继承的。我在帐户中有两个虚拟的void函数;存取款。我只是发布了储蓄存款功能的代码,因为这个问题对于代码的其余部分是重复的 我的Bank类中有一个函数,它将向account类型的向量添加一个account。每当我为储蓄对象调用存款函数时,它都会使用Account and not Save(使用调试器找到)的存款函数 起初我没有使用指针,但我经历了这个过程:并学会了在虚拟函数中使用指针 问题:是什么原因导致我的代码使用Account.cp

我有四门课,银行、账户、储蓄和支票。储蓄和支票都是从帐户公开继承的。我在帐户中有两个虚拟的void函数;存取款。我只是发布了储蓄存款功能的代码,因为这个问题对于代码的其余部分是重复的

我的Bank类中有一个函数,它将向account类型的向量添加一个account。每当我为储蓄对象调用存款函数时,它都会使用Account and not Save(使用调试器找到)的存款函数

起初我没有使用指针,但我经历了这个过程:并学会了在虚拟函数中使用指针

问题:是什么原因导致我的代码使用Account.cpp中的默认虚拟方法而不是Saving.cpp中预期的“多态”方法?我怎样才能修好它

Account.cpp

#pragma once
#include <string>
using std::string;
enum account_type { saving, checking };

class Account
{
public:
    Account();
    Account(int, account_type, double);
    ~Account();

    virtual void deposit(double&) {};
    virtual void withdraw(double&) {};
protected:
    int account_number;
    account_type type;
    double balance;

    int generateAccountNumber();
    double initializeBalance();
};
#pragma一次
#包括
使用std::string;
枚举帐户类型{保存,检查};
类别帐户
{
公众:
账户();
账户(整数,账户类型,双精度);
~Account();
虚空存款(双&){};
虚空收回(双&){};
受保护的:
国际帐户号码;
账户类型;
双平衡;
int generateAccountNumber();
双重初始化平衡();
};
Saving.cpp

class Saving : public Account
{
public:
    Saving();
    Saving(int, account_type, double);
    ~Saving();

    void deposit(double&) //deposits some amount into a saving account
    {
        if (amount < 0)
            throw "Cannot withdraw an amount less than $0.00";
        else if (amount > balance)
            throw "Cannot withdraw an amount greater than the current balance";
        else
            balance -= amount;
    }
 private:
    const double interest_rate = 0.01;
};
类别保存:公共帐户
{
公众:
保存();
储蓄(整数、账户类型、双精度);
~Saving();
作废存款(double&)//将部分金额存入储蓄账户
{
如果(金额<0)
抛出“不能提取少于$0.00的金额”;
否则如果(金额>余额)
抛出“不能提取大于当前余额的金额”;
其他的
余额-=金额;
}
私人:
常数双倍利率=0.01;
};
Bank.cpp

class Bank
{
private:
    vector <Account*> bank_accounts;
    //ORIGINAL BEFORE FIX: vector <Account> bank_accounts;
public:
    void Bank::addAccount(Account a) //adds some account to a vector
    {
        bank_accounts.push_back(a);
    }

    Account * findAccount(int acc_num) //finds the account by it's account number
    { 
        int found = -1;
        for (int y = 1; y <= (int)bank_accounts.size(); y++) {
        if (acc_num == bank_accounts[y - 1].getAccountNumber())
            found = y - 1;
        }

         if (found == -1) {
             throw "\nAccount not found";
         }
        else
        {
            if (bank_accounts[found].getAccountType() == 0)
            {
                Account * saving = &bank_accounts[found];
                return saving;
            }
        else if (bank_accounts[found].getAccountType() == 1)
        {
                Account * checking = &bank_accounts[found];
                return checking;
        }
     }
  }
}

int main()
{
    Bank Swiss;
    Saving s(num, type, bal); // some user values for these variables
    Account * tempAccount1 = &s;
    Swiss.addAccount(*tempAccount1);
    Swiss.findAccount(num)->deposit(amt);
}
类库
{
私人:
向量银行账户;
//修正前原件:矢量银行账户;
公众:
void Bank::addAccount(Account a)//将某些帐户添加到向量
{
银行账户。推回(a);
}
Account*findAccount(int acc_num)//通过其帐号查找帐户
{ 
int-found=-1;
对于(整数y=1;y存款(金额);
}

如果我没有弄错的话,代码副本中的这两行将
a
构造成
帐户
对象,从而破坏了多元关系

    void Bank::addAccount(Account a) //adds some account to a vector


我建议创建
bank\u账户
和指向
Account*
的智能指针数组。
addAccount
也应作为参考(
Account&
)或者一个智能指针。

我看不到这样做的代码,但问题是
银行
有一个账户向量,即
std::vector
。如果是这样的话,问题是派生类对象被推入向量时会被分割成
账户
对象,并且它们会丢失它们的属性派生属性。代码需要使用指向
account
的指针或引用。通常,这是通过
std::vector
std::vector
和分配了
new
的派生对象来完成的。代码还应该通过指针或引用传递从
account
派生的类型的对象,而不是通过值(例如,
void Bank::addAccount(Account a)
将不起作用,因为它将分割调用它的参数).

我一定错过了……我从来没有在任何地方看到过一个实际的问题……我冒昧地看了一眼,一定也错过了。@Raj,什么,具体是你的问题?因为你在Bank::addAccount中按值传递Account,名为a的变量将被“切片”(视为帐户而不是保存对象)。我不知道这是否是问题所在。您可以在编译时通过使函数纯虚拟来检测此类错误。您仍然没有使用指针。可能需要将
unique\u ptr
更改为
std::unique\u ptr
,以避免任何错误ambiguity@ArchbishopOfBanterbury-好的。谢谢。谢谢你指出丢失的银行我用你建议的解决方案更新了原始线程。你的建议似乎解决了我的问题。谢谢你的回复。我能够结合你和皮特·贝克尔的答案解决这个问题。
    bank_accounts.push_back(a);