0

好的,对多态性和虚函数如此陌生,我什至在调用我的第一个函数时遇到了问题。我相信问题出在调用本身,因为这会返回错误;

banking.cpp(289): error C2664: 'Checking::Balance' : cannot convert parameter 1 from 'Checking (__cdecl *)(void)' to 'Checking &'

我很确定这意味着我将错误的东西传递给函数。我知道我不能只为虚函数传递类实例的名称,它必须通过 ref 或作为指针传递。我已经尝试了这两种方法并得到相同的错误。

我省略了复制和粘贴整个内容,因为它是一个银行项目,并且有大量不相关的内容用于输入验证。父类是“Account”,“Checking”是从它派生的子类。“checkingObject”是我试图调用的“Checking”类实例的名称。

main .cpp 中的函数调用:

Checking::Balance(&checkingObject);

在 Account.h 中声明(父类):

virtual void Balance();

在 Checking.h(子类)中重新声明:

void Balance(Checking &);

Checking.cpp 中定义(balance 是类的私有成员):

void Checking::Balance(Checking &)
{
cout << balance;

}

我一定遗漏了一些东西,但我只是想将对象检查对象作为对函数的引用传递。我真的不明白错误消息“无法从'检查(__cdecl *)(void)'转换参数1 ”的部分。我对ClassName &的理解是,它将采用从该类派生的任何对象。

编辑:为了清楚起见,包括更多代码。

在banking.cpp(主文件)

Account accountObject();
    Checking checkingObject();
    Savings savingsObject();
int main()
{       
regScreen();
servicesScreen();   

return 0;
}

void checkingScreen()
{
system("cls");
int choice;

do
{
    string countString;     
    centerString("$$$$ Checking $$$$");
    cout << endl;       
    centerString("Account  Activites");
    cout << endl;       
    centerString("==================");
    cout << endl;       
    centerString("1) ----Deposit----");
    cout << endl;
    centerString("2) ----Withdraw---");
    cout << endl;
    centerString("3) ----Transfer---");
    cout << endl;
    centerString("4) ----Balance----");
    cout << endl;
    centerString("5) Personal  Check");
    cout << endl;
    centerString("6) ----Interest---");
    cout << endl;
    centerString("7) ---Statement---");
    cout << endl;
    centerString("8) -----Exit------");
    cout << endl;
    centerString("Enter selection: ");

    // Validate user input for menu choice
    while(!(cin >> choice) || (choice != 1 && choice != 2 && choice != 3 && choice != 4 && choice != 5 && choice != 6 && choice != 7 && choice != 8))
    {
        cout << "Error: Please re-enter a correct choice: ";
        cin.clear();
        fflush(stdin);
    }

    //Switch for user choices
    switch(choice)
    {
    case 1:
        {
            string userInput;
            double dollars;
            centerString("*** Deposit ***");
            cout << endl;
            centerString("Amount to deposit: ");
            cin >> userInput;
            dollars = validCurrency(userInput);             
        }
    case 2:
        {

        }
    case 3:
        {

        }
    case 4:
        {
            checkingObject.Balance();               
        }
    }
} while (choice != 8);
}

帐户标题

#ifndef ACCOUNT_H
#define ACCOUNT_H

#include<string>
using namespace std;

class Account
{
private:


string nameString;
    string titleString;
    string SSNString;
    string IDString;
public:
    //Constructor
    Account();

    // Mutators
    void setName(string), setTitle(string), setSSN(string), setID(string);
    virtual void Deposit(double);
    virtual void Withdraw(double);
    virtual void Transfer(string, double);
    virtual void Balance();
    virtual void Check();
    virtual void Interest();

    // Accessors
    virtual void Statement() const;
};
#endif  

检查标题

#ifndef CHECKING_H
#define CHECKING_H
#include"Account.h"

class Checking : public Account
{
private:
    double balance;
    double rate;

public:
    Checking(); // Default Constructor
    Checking(double, double);
    void Deposit(double);   
    void Balance();

};

#endif
4

4 回答 4

3

有几个问题,首先这不是覆盖虚拟方法:

void Balance(Checking &);

这是定义一个将隐藏父方法的新方法,派生的虚拟方法需要具有相同的签名。接下来这个电话:

Checking::Balance(&checkingObject);

在某些方面很奇怪,它应该是:

someInstanceOfChecking.Balance(checkingObject);

&checkingObject将是一个指向checkingObject. 当方法获取引用时,它会在幕后完成工作,您无需执行任何操作,只需传递您正在引用的对象的实例。

更新:

根据您新发布的代码,这似乎是一个合理的实现Checking::Balance

void Checking::Balance()
{
    std::cout << balance;
}

虽然我不清楚它是做什么Account::Balance的。另外,我想我看到了你更大的问题,你的全局变量定义不正确,这就是你想要的:

Account accountObject;
Checking checkingObject;
Savings savingsObject;

您在代码中拥有的是函数声明,例如:

Checking checkingObject();

声明一个调用的函数,该函数checkingObject返回一个Checking对象。

于 2013-05-18T01:27:57.657 回答
2

没有看到更多代码,很难完全确定;但我相信,而不是这个:

Checking::Balance(&checkingObject);

你想要的是这样的:

checkingObject.Balance();

而不是这个:

void Balance(Checking &)

这个:

void Balance()
于 2013-05-18T01:27:44.467 回答
1

好的,首先,您的电话是指向checkingObject(即 a Checking *)的指针。这不是你想要的,而是通过checkingObject,而不是&checkingObject.

其次,您没有调用虚函数。要正确重载虚函数,子类函数必须与父类函数具有相同的签名(所有参数和返回值必须相同)。您正在做的是创建一个具有相同名称和不同签名的新函数。现在,由于您使用类名调用它,因此您将获得所需的对象,但如果您要获取一个Account对象并尝试调用Balance(checkingObject)它,它将失败。

于 2013-05-18T01:28:15.330 回答
1

这里有很多问题。首先:

void Balance(Checking &);

不会覆盖virtual void Balance();您在 中声明的方法Account。方法签名应该相同。例如,在您的Checking课堂上,它应该如下所示:

void Balance();

Checking.cpp 然后应该是:

void Checking::Balance()
{
    cout << balance;
}

然后 main 中的调用应如下所示:

Checking account;    // Creates the checking account object
account.Balance();
于 2013-05-18T01:29:19.600 回答