通过指向基类对象的指针来操作派生类对象的指针

che*_*r89 5 c++ inheritance pointers

我有这个代码代表银行:

class Bank {
    friend class InvestmentMethod;
    std::vector<BaseBankAccount*> accounts;
public:
//...
Run Code Online (Sandbox Code Playgroud)

BaseBankAccount是银行中所有帐户的抽象类:

class BaseBankAccount {
    public:
        BaseBankAccount() {}
        virtual int getInterest() const = 0;
        virtual int getInvestedSum() const = 0;
        virtual void increaseDepositSum(int additionalSum) = 0;
        virtual void close(std::string& reason) = 0;
        virtual ~BaseBankAccount() {}
};
Run Code Online (Sandbox Code Playgroud)

问题是,当我通过指向基类对象的指针操作指向派生类对象的指针时,我可以调用的方法集受BaseBankAccount公共接口的限制 - 无论REAL对象是什么类型.

例如,并非每个帐户都可以选择增加已投入的金额 - 所以,我没有在基类中包含此方法:

class BankAccount: public BaseBankAccount {
protected:
    BaseDeposit* deposit;
    double sumInvested;
public:
    BankAccount(int sum, int term, int inter): sumInvested(sum), depositTerm(term), interest(inter) {}
    int getInterest() const { return interest; }
    int getInvestedSum() const { return sumInvested; }
    void prolong(int increaseTerm) {
        depositTerm += increaseTerm;
    }
    void increaseInvestment(double addition) {
            sumInvested += addition;
    }
    virtual ~BankAccount() {}
};
Run Code Online (Sandbox Code Playgroud)

那么,我想称之为:

Bank bank1(...);
bank1.accounts[i]->increaseInvestment(1000.0);
Run Code Online (Sandbox Code Playgroud)

那么,在这种情况下,我该怎么做才能访问派生类对象的接口?据我所知,每次我需要调用特定功能时,向下转换为具体类型并不好.
创建一个从此派生的抽象类来扩展接口?
为我需要实现的每种特定类型创建并行层次结构(看起来有点重要)?

The*_*ger 7

从基类访问更多派生类功能的解决方案是访问者模式.

class BaseBankAccount {
public:
    ...
    virtual void AcceptVisitor(IVisitor& v) = 0;
};


class AccountTypeA : public BaseBankAccount {
public:
   void TypeAFeature() {...}

   void AcceptVisitor(IVisitor& v)
   {
       v.VisitAccountTypeA(*this);
   }
};

class AccountTypeB : public BaseBankAccount {
public:
   void TypeBFeature() {...}

   void AcceptVisitor(IVisitor& v)
   {
       v.VisitAccountTypeB(*this);
   }
};

class IVisitor {
public:
    virtual void VisitAccountTypeA(AccountTypeA& account) = 0;
    virtual void VisitAccountTypeB(AccountTypeB& account) = 0;
};

class ConcreteVisitor : public IVisitor{
public:
    void VisitAccountTypeA(AccountTypeA& account) 
    {
         account.TypeAFeature(); //Can call TypeA features
    }

    void VisitAccountTypeB(AccountTypeB& account) 
    {
         account.TypeBFeature(); //Can call TypeB Features
    }
};
Run Code Online (Sandbox Code Playgroud)

这种互动并不是很明显.您可以在基类中定义纯虚方法AcceptVisitor,它将类型为IVisitor的Object作为参数.IVisitor在层次结构中每个派生类有一个方法.每个派生类都以不同方式实现AcceptVisitor,并调用与其具体类型(AccountTypeA和AccountTypeB)对应的方法,并将具体引用传递给该方法.您实现了在从IVisitor派生的对象中使用更多派生类型的函数的功能.维基百科:访客模式