如何通过向下转换访问派生数据?

时间:2016-11-18 22:54:50

标签: c++

为什么我不能在没有EXC_BAD_ACCESS错误的情况下执行以下代码? 所以p_base是一个指向基类的指针数组。数组中的指针指向3个不同的类对象,它们都有自己的数据和基础数据。

在下面的代码中,我试图将基指针向下转换为派生类指针之一,这样我就可以访问该对象的一个​​属性来总结bank_fees

由于我不知道哪个迭代包含derived1对象,所以我使用循环来向下转换所有对象指针,但它不正确。如何在不知道哪个迭代派生对象位于哪个?

的情况下,将基类指针向下转换为derived1
class base{

protected:
   string transaction_date_;
   int transaction_id_;
   double transaction_amount_;
public:
    Transaction();
    Transaction(string,int,double);

//Pure virtual function
    virtual void Display() const = 0;
}

class derived1{
private:
    double fee_charge_;
public: 
    double get_fee_charge() const{
        return fee_charge_; 
    };
    void set_fee_charge(double fee){
        fee_charge_ = fee;
    };
    virtual void Display() const;
}


void Customer::method(){
double bank_fees = 0;

derived *p_derived1 = new derived1;

for(int i =0;i<16;i++){
    p_base[i]->Display();
    p_derived1 = dynamic_cast<derived*>(p_base[i]);
    bank_fees += p_derived1->get_fee_charge();
}

cout << bank_fees;
}

1 个答案:

答案 0 :(得分:0)

tmp as! String之后,您需要在使用指针之前检查它是否成功。

downcast

另外,你不需要

p_derived1 = dynamic_cast<derived1*>(p_base[i]);
if ( p_derived1 != nullptr )
{
   bank_fees += p_derived1->get_fee_charge();
}

导致内存泄漏。您可以完全删除该行,并在循环中声明derived1 *p_derived1 = new derived1;

p_derived1