2017-02-11 2 views
-2

Ii'm пытается выяснить, как вызвать производный метод только класса из указателя базового класса без объявления его 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 

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, conti[0]->calcolaInteresse(); дает ошибку компилятора:

класс ContoBancario не имеет члена по имени 'calcolaInteresse'.

Как я могу это решить?

+1

Вы решить эту проблему, разработав классы правильно, вместо того, чтобы пытаться найти способ взломать вокруг плохой дизайн класса. –

+0

Это не единственная ошибка компилятора. Не существует метода 'ritira', выставленного из' ContoBancario', и не существует метода «депозита». Существует * метод 'deposit', поэтому, возможно, последняя является простой опечаткой (что постоянно меня смешивает в обстоятельствах, когда нужно делать резку/вставку, а не встроенную разработку кода в орган вопроса). – WhozCraig

+0

Дана конструкция класса, может меняться – RagingLeviathan

ответ

1

Если вы не пересмотрите свой дизайн класса, способ сделать это с dynamic_cast:

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

Это требует RTTI (Run Time Type Information) включена в вашем компиляторе.

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

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