c ++调用虚函数时出错

时间:2013-05-18 01:22:58

标签: c++

好的,对多态性和虚函数都是新手,我甚至在调用我的第一个函数时遇到了问题。我认为问题出在调用本身,因为这会返回错误;

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

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

我省略了复制和粘贴整个事情,因为它是一个银行项目,如果输入验证没有相关的东西。父类是“帐户”,“正在检查”是从中派生的子类。 '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;

}

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

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

在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 个答案:

答案 0 :(得分: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对象。

答案 1 :(得分:2)

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

Checking::Balance(&checkingObject);

你想要的是这个:

checkingObject.Balance();

而不是:

void Balance(Checking &)

这样:

void Balance()

答案 2 :(得分:1)

好的,首先,您的呼叫指向checkingObject(即Checking *)。这不是您想要的,而只是传递checkingObject,而不是&checkingObject

其次,您没有调用虚函数。要正确地重载虚函数,子类函数必须具有与父类相同的签名(所有参数和返回值必须相同)。你正在做的是创建一个具有相同名称和不同签名的新功能。现在,既然你使用类名调用它,你就会得到你想要的那个,但是如果你要使用Account对象并尝试在其上调用Balance(checkingObject),它就会失败。

答案 3 :(得分:1)

这里有很多问题。首先:

void Balance(Checking &);

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

void Balance();

那么Checking.cpp应该是:

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

主要的呼叫应该如下:

Checking account;    // Creates the checking account object
account.Balance();