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