Hello Everyone, I've been working on this project for a little bit, but have run into a snag. This is a learning project on Polymorphism using different Banking Account types.
I have 3 issues that I can't seem to resolve as follows:
All of the errors are in my polymorphicBanking.cpp file, but I am providing all the project files below. If anyone can tell me what I am doing wrong and how to resolve my issues, it would be most appreciated! I'm still pretty new at C++![:/]()
polymorphicBanking.cpp
Account.h
Account.cpp
CheckingAccount.h
CheckingAccount.cpp
SavingsAccount.h
SavingsAccount.cpp
I have 3 issues that I can't seem to resolve as follows:
- error C2259: 'SavingsAccount' : cannot instantiate abstract class. The error is flagging as my account[0] vector declaration.
accounts[ 0 ] = new SavingsAccount( 25.0, .03 );
- error C2259: 'SavingsAccount' : cannot instantiate abstract class. The error is flagging as my account[2] vector declaration.
accounts[ 2 ] = new SavingsAccount( 200.0, .015 );
- error C2059: syntax error : '*'. I am attempting to use a dynamic_cast to downcast my Account pointer 'i' to a SavingsAccount pointer. I'm a little confused as to proper syntax, it is the '*' in '<*savingsAccountPtr>' that is flagging the error. It says it expected a type specifier?
SavingsAccount *savingsAccountPtr = dynamic_cast<*savingsAccountPtr>(accounts[i]);
All of the errors are in my polymorphicBanking.cpp file, but I am providing all the project files below. If anyone can tell me what I am doing wrong and how to resolve my issues, it would be most appreciated! I'm still pretty new at C++

polymorphicBanking.cpp
// Lab 1: polymorphicBanking.cpp // Processing Accounts polymorphically. #include <iostream> #include <iomanip> #include <vector> using namespace std; #include "Account.h" // Account class definition #include "SavingsAccount.h" // SavingsAccount class definition #include "CheckingAccount.h" // CheckingAccount class definition int main() { // create vector accounts vector < Account * > accounts( 4 ); // initialize vector with Accounts accounts[ 0 ] = new SavingsAccount( 25.0, .03 ); accounts[ 1 ] = new CheckingAccount( 80.0, 1.0 ); accounts[ 2 ] = new SavingsAccount( 200.0, .015 ); accounts[ 3 ] = new CheckingAccount( 400.0, .5 ); cout << fixed << setprecision( 2 ); // loop through vector, prompting user for debit and credit amounts for ( size_t i = 0; i < accounts.size(); i++ ) { cout << "Account " << i + 1 << " balance: $" << accounts[i]->getBalance() << endl; double withdrawalAmount = 0.0; cout << "\nEnter an amount to withdraw from Account " << i + 1 << ": "; cin >> withdrawalAmount; accounts[i]->debit(withdrawalAmount); double depositAmount = 0.0; cout << "Enter an amount to deposit into Account " << i + 1 << ": "; cin >> depositAmount; accounts[i]->credit(depositAmount); // downcast pointer SavingsAccount *savingsAccountPtr = dynamic_cast<*savingsAccountPtr>(accounts[i]);////dynamic_cast<Account*>(&savingsAccountPtr); // if Account is a SavingsAccount, calculate and add interest if ( &savingsAccountPtr != 0 ) { double interestEarned = savingsAccountPtr->calculateInterest();; cout << "Adding $" << interestEarned << " interest to Account " << i + 1 << " (a SavingsAccount)" << endl; /* Use the credit function to credit interestEarned to the SavingsAccount pointed to by savingsAccountPtr*/ savingsAccountPtr->credit(interestEarned); } // end if cout << "Updated Account " << i + 1 << " balance: $" << accounts[i]->getBalance() << "\n\n"; } // end for } // end main
Account.h
// Account.h // Definition of Account class. #ifndef ACCOUNT_H #define ACCOUNT_H class Account { public: Account( double ); // constructor initializes balance virtual void credit(double) = 0; virtual bool debit(double) = 0; void setBalance( double ); // sets the account balance double getBalance(); // return the account balance private: double balance; // data member that stores the balance }; // end class Account #endif
Account.cpp
// Account.cpp // Member-function definitions for class Account. #include <iostream> using namespace std; #include "Account.h" // include definition of class Account // Account constructor initializes data member balance Account::Account( double initialBalance ) { // if initialBalance is greater than or equal to 0.0, set this value // as the balance of the Account if ( initialBalance >= 0.0 ) balance = initialBalance; else // otherwise, output message and set balance to 0.0 { cout << "Error: Initial balance cannot be negative." << endl; balance = 0.0; } // end if...else } // end Account constructor // credit (add) an amount to the account balance void Account::credit( double amount ) { balance = balance + amount; // add amount to balance } // end function credit // debit (subtract) an amount from the account balance // return bool indicating whether money was debited bool Account::debit( double amount ) { if ( amount > balance ) // debit amount exceeds balance { cout << "Debit amount exceeded account balance." << endl; return false; } // end if else // debit amount does not exceed balance { balance = balance - amount; return true; } // end else } // end function debit // set the account balance void Account::setBalance( double newBalance ) { balance = newBalance; } // end function setBalance // return the account balance double Account::getBalance() { return balance; } // end function getBalance
CheckingAccount.h
// CheckingAccount.h // Definition of CheckingAccount class. #ifndef CHECKING_H #define CHECKING_H #include "Account.h" // Account class definition class CheckingAccount : public Account { public: // constructor initializes balance and transaction fee CheckingAccount( double, double ); void credit(double); bool debit(double); private: double transactionFee; // fee charged per transaction // utility function to charge fee void chargeFee(); }; // end class CheckingAccount #endif
CheckingAccount.cpp
// CheckingAccount.cpp // Member-function definitions for class CheckingAccount. #include <iostream> using namespace std; #include "CheckingAccount.h" // CheckingAccount class definition // constructor initializes balance and transaction fee CheckingAccount::CheckingAccount( double initialBalance, double fee ) : Account( initialBalance ) // initialize base class { transactionFee = ( fee < 0.0 ) ? 0.0 : fee; // set transaction fee } // end CheckingAccount constructor // credit (add) an amount to the account balance and charge fee void CheckingAccount::credit( double amount ) { Account::credit( amount ); // always succeeds chargeFee(); } // end function credit // debit (subtract) an amount from the account balance and charge fee bool CheckingAccount::debit( double amount ) { bool success = Account::debit( amount ); // attempt to debit if ( success ) // if money was debited, charge fee and return true { chargeFee(); return true; } // end if else // otherwise, do not charge fee and return false return false; } // end function debit // subtract transaction fee void CheckingAccount::chargeFee() { Account::setBalance( getBalance() - transactionFee ); cout << "$" << transactionFee << " transaction fee charged." << endl; } // end function chargeFee
SavingsAccount.h
// SavingsAccount.h // Definition of SavingsAccount class. #ifndef SAVINGS_H #define SAVINGS_H #include "Account.h" // Account class definition class SavingsAccount : public Account { public: // constructor initializes balance and interest rate SavingsAccount( double, double ); double calculateInterest(); // determine interest owed private: double interestRate; // interest rate (percentage) earned by account }; // end class SavingsAccount #endif
SavingsAccount.cpp
// SavingsAccount.cpp // Member-function definitions for class SavingsAccount. #include "SavingsAccount.h" // SavingsAccount class definition // constructor initializes balance and interest rate SavingsAccount::SavingsAccount( double initialBalance, double rate ) : Account( initialBalance ) // initialize base class { interestRate = ( rate < 0.0 ) ? 0.0 : rate; // set interestRate } // end SavingsAccount constructor // return the amount of interest earned double SavingsAccount::calculateInterest() { return getBalance() * interestRate; } // end function calculateInterest