2015-04-07 2 views
0

Почему метод depositmoney() в методе операции класса учетной записи вызывает класс depositmoney() класса учетной записи, а не класс Sav_account? Прямой вызов метода depositmoney() вызывает метод подкласса, который является очевидным. Но не могу понять, почему косвенный вызов от operations() не дает ожидаемого результата.Унаследованный переопределенный метод не называется

#include<iostream> 
#include<conio.h> 
#include<string> 
using namespace std; 
int temp = 0; 

class account 
{ 
protected: 
    string name; 
    double balance; 
    int AccNo; 
public: 
    void operations() 
    { 
     int r = 0; 
     do{ 
      cout << "1.DEPOSIT" << endl; 
      cout << "2.WITHDRAW" << endl; 
      cout << "3.CHECK BALANCE" << endl; 
      cout << "0.EXIT" << endl; 
      cin >> r; 
      switch(r) 
      { 
      case 1:this->depositmoney(); 
       break; 
      case 2:this->withdraw(); 
       break; 
      case 3:this->displaybalance(); 
       break; 
      case 0:cout << "Exiting" << endl; 
       break; 
      default: 
       break; 
      } 
     } 
     while(r != 0); 
    } 
    account(string Name, double bal) 
    { 
     name = Name; 
     balance = bal; 
     AccNo = temp++; 
    } 
    void displaybalance() 
    { 
     cout << "name :" << name << endl; 
     cout << "A/C" << AccNo << endl; 
     cout << "your balance is " << balance << endl; 
    } 
    void depositmoney() 
    { 
     float deposit; 
     cout << "enter deposit" << endl; 
     cin >> deposit; 
     balance += deposit; 
    } 
protected: 
    void withdraw() 
    { 
     float withdrawal; 
     cout << "enter witdrawal amount" << endl; 
     cin >> withdrawal; 
     if(balance >= withdrawal) 
     { 
      balance -= withdrawal; 
     } 
     else 
     { 
      cout << "insufficient funds" << endl; 
     } 
    } 
}; 

class Sav_account :public account 
{ 
private: 
    double const CI = 5; 
    void depositinterest() 
    { 
     balance += balance*CI/100; 
    } 
public: 
    Sav_account(string Name, double bal) :account(Name, bal) 
    { 
     AccType = 0; 
    } 
    void depositmoney() 
    { 
     account::depositmoney(); 
     depositinterest(); 
    } 
}; 

void main() 
{ 
    Sav_account *account1 = new Sav_account("Shaw", 50000); 
    account1->operations();// DEPOSIT RESULTS IN NO INTEREST 
    account1->displaybalance(); 
    account1->depositmoney(); // **DEPOSIT FUNCTION OF Sav_account CALLS      interest function** 
    account1->displaybalance(); 
    _getch(); 
} 
+0

Пожалуйста, добавьте соответствующий тег для используемого вами языка. –

+0

код не компилируется: 'AccType = 0;': ошибка: «AccType» не был объявлен в этой области » – varnie

+0

Я удалил несколько строк перед загрузкой вопроса, и похоже, что я забыл это! – Snc

ответ

1

Ваш класс не является полиморфным. У вас нет полиморфных функций и ничего не отменено. (Вместо этого у вас есть скрытые функции). Таким образом, вызывая depositmoney(); от функции account, вызывается account::depositmoney().

Для создания полиморфного класса вам необходимо использовать виртуальные функции. Любая функция, которую вы хотите иметь полиморфное поведение, должна быть объявлена ​​как virtual в базовом классе, например. в account здесь:

virtual void depositmoney() { 

В производном классе, так как C++ 11, вы можете написать:

void depositmoney() override 
        ^^^^^^^^ 

который вызовет ошибку компиляции, если вы случайно скрыть функцию, когда вы пытаетесь переопределить его. (Хотя я предполагаю, что вы используете компилятор, который не поддерживает C++ 11, так как большинство из них также отклонят void main).


Кроме того, любой полиморфной базовый класс должен иметь виртуальный деструктор, т.е. virtual ~account() {} в противном случае код account *x = new Sav_account("Shaw", 50000); delete x; приведет к неопределенному поведению.

void main является незаконным, main должен иметь тип возврата int.

+0

Спасибо за решение! – Snc

1

Там не являются любые переопределенные методы в классах; вы не сделали ни одного из них virtual.

Смежные вопросы