好的,对多态性和虚函数都是新手,我甚至在调用我的第一个函数时遇到了问题。我认为问题出在调用本身,因为这会返回错误;
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
答案 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();