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)
那么,在这种情况下,我该怎么做才能访问派生类对象的接口?据我所知,每次我需要调用特定功能时,向下转换为具体类型并不好.
创建一个从此派生的抽象类来扩展接口?
为我需要实现的每种特定类型创建并行层次结构(看起来有点重要)?
从基类访问更多派生类功能的解决方案是访问者模式.
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派生的对象中使用更多派生类型的函数的功能.维基百科:访客模式