2016-09-18 16 views
-1

次のコードには3つのクラスがあります。 account,savings(由来)、current(由来)。しかし、基本クラスのメンバー関数のうち3つは継承されません。これは私が得るエラーです。あなたはメンバー関数がC++で継承されない

void savingsAccount:: display(){/* rest here */} 

を行うと、あなたがsavingsAccount::display()と呼ばれるメンバ関数の定義を実装するためにコンパイラに指示していた仮想関数

In file included from main.cpp:1:0: 
classes.hpp:96:30: error: no ‘void savingsAccount::deposit()’ member function declared in class ‘savingsAccount’ 
void savingsAccount::deposit() 
          ^
classes.hpp:105:31: error: no ‘void savingsAccount::withdraw()’ member function declared in class ‘savingsAccount’ 
void savingsAccount::withdraw() 
          ^
classes.hpp:130:31: error: no ‘void savingsAccount::display()’ member function declared in class ‘savingsAccount’ 
void savingsAccount:: display() 
          ^
classes.hpp:181:30: error: no ‘void currentAccount::deposit()’ member function declared in class ‘currentAccount’ 
void currentAccount::deposit() 
          ^
classes.hpp:190:31: error: no ‘void currentAccount::withdraw()’ member function declared in class ‘currentAccount’ 
void currentAccount::withdraw() 
          ^
classes.hpp:220:31: error: no ‘void currentAccount::display()’ member function declared in class ‘currentAccount’ 
void currentAccount:: display() 
#include<iostream> 
#include<cstring> 
#define MAX 50 

#ifndef classes_h 
#define classes_h 

using namespace std; 
class account 
{ 
    protected: 
     char name[MAX]; 
     int accountNumber; 
     char type[MAX]; 
     float balance; 
     float minBalance; 
     static int Customers; 
    public: 
     account(); 
     account(char*,int); 

     void deposit();  
     void withdraw(); 
     void display(); 
     int getAccountNumber(); 
     static void numberOfCustomers(); 

}; 

account::account(char* name, int accountNumber) 
{ 
    strcpy(this->name,name); 
    this->accountNumber=accountNumber; 
    //strcpy(this->type,type); 
    this->balance=0; 
    Customers++; 
} 

int account::Customers=0; 
void account ::numberOfCustomers() 
{ 
    cout<<"Total number of customer-------->"<<Customers; 
} 

void account::display() 
{ 

} 

/******************************** 
//Savings Account class 
********************************/ 

class savingsAccount: public account 
{ 
    protected: 
     float minBalance; 
    // float rate; 
    public: 
     savingsAccount(); 
     savingsAccount(char*,int); 
     savingsAccount(account&); //Copy Constructor 
/*  void deposit();  //user 
     void withdraw(); //user 
     void display();  //user 
*/  int getAccountNumber(); 
}; 



savingsAccount::savingsAccount(char* name, int accountNumber):account(name,accountNumber) 
{ 
    minBalance=0; 
    strcpy(type,"savings"); 
} 


savingsAccount::savingsAccount(account& tp):account(tp) 
{ 
    minBalance=0; 
    strcpy(type,"savings"); 
} 



int savingsAccount::getAccountNumber() 
{ 
    return accountNumber; 
}  




void savingsAccount::deposit() 
{ 
    float amount; 
    cout<<"Enter the amount needs to be deposited"<<endl; 
    cin >> amount; 
    balance=balance+amount; 
} 


void savingsAccount::withdraw() 
{ 
    float amount ; 
    if(balance ==0) 
    { 
     cout<<"Account balance is Nil"<<endl; 
     return; 
    } 
    cout<<"Enter the amount yout would like to withdraw"<<endl; 
    while(1) 
    { 
     cin>>amount; 
     if(balance-amount<0) 
     { 
      cout<<"insufficient funds, try some less amount\n"; 

     } 
     else 
     { 
      balance=balance-amount; 
      return ; 
     } 
    } 
} 

void savingsAccount:: display() 
{ 
    cout<<"Account Number"<<accountNumber<<endl; 
    cout<<"Name-->"<<name<<endl; 
    cout<<"Accounttype-->Savings"<<endl; 
    cout<<"Balance-->"<<balance<<endl; 
    cout<<"Minimum Balance -->"<<minBalance; 

} 

/*********************************** 
//Current Account class 
************************************/ 
class currentAccount: public account 
{ 
    protected: 
     float minBalance; 
    public: 
     currentAccount(); 
     currentAccount(char*,int); 
     currentAccount(account&); 
/*  void deposit(); 
     void withdraw(); 
     void display(); 
*/  int getAccountNumber(); 

}; 

/* 
currentAccount::currentAccount(char* name, int accountNumber):account((char*)name,accountNumber,"current account") 
{ 
    minBalance=1000; 
    balance=1000; 
} 
*/ 
currentAccount::currentAccount(char* name, int accountNumber):account(name,accountNumber) 
{ 
    minBalance=0; 
    strcpy(type,"Current"); 
} 


currentAccount::currentAccount(account& tp):account(tp) 
{ 
    minBalance=0; 
    strcpy(type,"Current"); 
} 




void currentAccount::deposit() 
{ 
    float amount; 
    cout<<"Enter the amount needs to be deposited"<<endl; 
    cin >> amount; 
    balance=balance+amount; 
} 


void currentAccount::withdraw() 
{ 
    float amount ; 
    if(balance ==0) 
    { 
     cout<<"Account balance is Nil"<<endl; 
     return; 
    } 
    cout<<"Enter the amount yout would like to withdraw"<<endl; 
    while(1) 
    { 
     cin>>amount; 
     if(balance-amount<0) 
     { 
      cout<<"insufficient funds, try some less amount\n"; 

     } 
     else 
     { 
      balance=balance-amount; 
      return ; 
     } 
    } 
    if(balance-amount<1000) 
    { 
     cout<<"Please keep the balance above minimum balance "; 
    } 

} 

void currentAccount:: display() 
{ 
    cout<<"Account Number"<<accountNumber<<endl; 
    cout<<"Name-->"<<name<<endl; 
    cout<<"Accounttype-->Current Account"<<endl; 
    cout<<"Balance-->"<<balance<<endl; 
    cout<<"Minimum Balance -->"<<minBalance; 

} 

int currentAccount::getAccountNumber() 
{ 
    return accountNumber; 
}  

#endif 

答えて

1

を使用せずに行うことが可能です。ただし、派生クラス宣言にこのメンバー関数があることは指定しないでください。あなたはそれをオーバーロードしているので、あなたは

class savingsAccount: public account 
{ 
    /* virtual */ void display() /* override */; // probably you want this virtual in the base class 
    // the rest 
}; 

のように、派生クラスにその署名を追加する必要がありそうでない場合、コンパイラはベースバージョン、すなわちaccount::display()が存在することを知っています。したがって、account::display()、つまり基本クラスのメンバ関数しか持たないため、コンパイラはsavingsAccount::display()メンバ関数がないことを実際にあなたに伝えています。

あなたの全体の問題は、PS

struct X 
{ 
    void f(); 
}; 

struct Y: X 
{ 
    // void f(); 
}; 

// error if you don't add the signature in Y, 
// there is no Y::f(), only the X::f() inherited part 
void Y::f(){} 

int main(){} 

Live on Coliru

に簡素化することができます:あなたはおそらく、これらの関数すぎvirtual(ともあなたのメンバ変数を変更しないものにconstを追加したいです)、あなたは適切なオーバーライドを持っています。そうしないと、派生メンバーは、ポインタ階層へのポインタによって制御されるクラス階層を持っているときに、あなたが望むように振る舞いません。

PSSは:どの#include前に、あなたのヘッダーの先頭に

#ifndef classes_h 
#define classes_h 

を置きます。

+0

いいえ、親から継承するために派生クラスの関数を再宣言する必要はありません。 –

+0

@ MarkRansom派生クラスで定義を提供するが、OPのようにプロトタイプを提供できない場合は、 [ここ](http://coliru.stacked-crooked.com/a/40cd6c6e006a7369)。おそらく私は私の答えであまりにも明確ではなかった、私はあなたが継承するために再宣言する必要があると言っているわけではない、私はちょうど言っている**あなたが再宣言すれば、派生クラスの宣言で署名が必要コンパイラは基本メンバ関数を参照します。 – vsoftco

+0

申し訳ありませんが、私のところには理解の誤りがあります。良い答え。 –

関連する問題