【发布时间】:2017-12-08 09:47:51
【问题描述】:
我正在使用继承编写代码,其中有一个名为 BankAccount 的基类和一个名为 MoneyMarket Account 的子类,我的代码收到以下错误
hw7main.cpp: In function ‘int main()’:
hw7main.cpp:9: error: cannot declare variable ‘account1’ to be of abstract type ‘MoneyMarketAccount’
hw7.h:36: note: because the following virtual functions are pure within ‘MoneyMarketAccount’:
hw7.h:41: note: virtual bool MoneyMarketAccount::withdraw(double)
根据其他类似问题的答案,我尝试覆盖虚函数,退出,但我仍然得到同样的错误。
这是我的基类接口(文件名:hw7base.h):
#ifndef HW7BASE_H
#define HW7BASE_H
#include <iostream>
#include <string>
using namespace std;
class BankAccount
{
public:
//constructors
BankAccount();
//member functions
bool deposit(double money);
virtual bool withdraw (double money)=0;
//accessor functions
void getName(BankAccount* account);
void getBalance(BankAccount* account);
//transfer function
//virtual void transfer (BankAccount* deposit, BankAccount* withdrawal, double money);
//private:
string name;
double balance;
};
#endif
这是我的子类接口(文件名:hw7derived1.h):
#ifndef HW7DERIVED1_H
#define HW7DERIVED1_H
#include <iostream>
#include "hw7base.h"
using namespace std;
class MoneyMarketAccount: public BankAccount
{
public:
//constructor
MoneyMarketAccount();
//override function
virtual bool withdraw(double money)=0;
int number_of_withdrawals;
};
#endif
这是我的子类实现(文件名:hw7derived1.cpp):
#include "hw7derived1.h"
using namespace std;
//consturctor
MoneyMarketAccount::MoneyMarketAccount()
{
number_of_withdrawals = 0;
}
bool MoneyMarketAccount::withdraw(double money)
{
if (money<=0)
{
cout<<"Failed.\n";
return false;
}
else
{
balance-=money;
if(number_of_withdrawals>=2)
{
balance-=1.5;
if (balance<0)
{
balance=balance+1.5+money;
cout<<"Failed.\n";
return false;
}
else
{
number_of_withdrawals++;
cout<<"Success.\n";
return true;
}
}
else
{
if (balance<0)
{
balance+=money;
cout<<"Failed.\n";
return false;
}
else
{
number_of_withdrawals++;
cout<<"Success.\n";
return true;
}
}
}
}
感谢任何帮助/见解,谢谢!
【问题讨论】:
-
virtual bool withdraw(double money)=0;-- 您应该从覆盖函数中删除=0。另外,override是你的朋友 :) -
@Quentin 这应该是一个(接受的)答案!
-
@GianPaolo SO 不鼓励围绕错别字建立问答环节——OP 现在会很开心,但这对其他人无济于事。事实上,这是一个接近投票的原因。
-
对,@Quentin,我同意你的看法
-
正如@Quentin 所说,您正在实现一个无论如何声明为纯虚拟的函数,因此您的
MoneyMarketAccount无论如何都是抽象的。对我来说,编译器允许实现纯虚函数听起来很奇怪,但就是这样。请参阅this answer 了解更多信息
标签: c++ virtual-functions