2017-02-11 4 views
-2

派生クラスのみのメソッドを基本クラスポインタから呼び出す方法を理解するために、基本クラスと派生クラスの両方でvirtualを宣言していません。基本クラスポインタから派生関数(オーバーライドされていない)を呼び出す

私のコードは次のとおりです。

ContoBancario.h

#ifndef BANCARIO_H 
#define BANCARIO_H 


class ContoBancario{ 


private: 
     double saldo; 

public: 
     ContoBancario(double); 
     void setSaldo(double); 
     double getSaldo(); 

     virtual void deposita (double); 
     virtual void ritira (double); 


}; 

#endif 

ContoVincolato.h

#ifndef VINCOLATO_H 
#define VINCOLATO_H 


#include "ContoBancario.h" 

class ContoVincolato:public ContoBancario { 

private: 

    double tasso; 

public: 

    ContoVincolato(double,double); 
    double calcolaInteresse(); 


}; 


#endif 

i「は私のメインのファイルにContoCorrente.h

#ifndef CORRENTE_H 
#define CORRENTE_H 

#include "ContoBancario.h" 

class ContoCorrente : public ContoBancario { 

private: 
    double costoOp; 

public: 
    ContoCorrente(double,double); 
    void setCostoOp(double); 



    virtual void deposita(double); 
    virtual void ritira(double); 




}; 




#endif 

、 veはpのベクトルを作成しました基底クラスにointer、そのポイント2クラスのインスタンスへ:

ContoVincolato c1(2500, .05); 

ContoCorrente c2 (1500, 1.5); 


vector <ContoBancario *> conti(2); 
conti[0]=&c1; 
conti[1]=&c2; 

ので、私はちょうど

for (size_t i=0;i<conti.size();i++){ 

    conti[i]->ritira(500); 
    conti[i]->deposita(350); 
} 

でポインタを使用して仮想関数を再定義するためのアクセスを取得しかし:私はどのように把握することはできません私はContoVincolato.hでオーバーライドしなかったメソッドを使用します。はコンパイラエラーを出します:

class ContoBancarioには 'calcolaInteresse'というメンバーはいません。

どうすればこの問題を解決できますか?

+1

あなたは正しく、あなたのクラスを設計するのではなく、不正なクラス設計の周りにハックする方法を見つけることを試みることによってこの問題を解決。 –

+0

それだけでコンパイルエラーではありません。 'ContoBancario'から' ritira'メソッドが公開されておらず、 'depositita'メソッドもありません。 * 'deposit 'メソッドがあるので、おそらく後者はシンプルなタイプミスです(質問ボディのインラインコードオーサリングではなく、カット/貼り付けが行われるべき状況で、私を引き続き混乱させるものです)。 – WhozCraig

+0

クラスデザインが与えられている、変更することはできません – RagingLeviathan

答えて

1

あなたのクラスのデザインを再考しない場合は、これを行う方法はdynamic_castである:

ContoCorrente *contoC = dynamic_cast<ContoCorrente *>(conti[0]); 
if (contoC != nullptr) 
{ 
    val = contoC->calcolaInteresse(); 
} 

これは、RTTI(実行時型情報)をお使いのコンパイラで有効になっていることが必要です。

http://en.cppreference.com/w/cpp/language/dynamic_cast

関連する問題