从基类指针调用派生函数(未重写)

时间:2017-02-11 00:57:15

标签: c++ pointers polymorphism

我试图弄清楚如何从基类指针调用派生的仅类方法,而不在基类和派生类中声明它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

现在,在我的主文件中,我创建了一个指向基类的指针向量,指向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没有名为&#39; calcolaInteresse&#39;的成员。

我怎么解决这个问题?

1 个答案:

答案 0 :(得分: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