39項 継承の階層構造を下る方向のキャスト(ダウンキャスト)は避けよう
継承の階層構造を下る方向のキャスト(ダウンキャスト)は避けよう
ダウンキャストを安全に行えるdynamic_castがありますが、dynamic_castは使うべきではありません。
下の例でdynamic_castを使い、多態性を実現しています。
class BankAccount { public: BankAccount(){...} ~BankAccount(){...} virtual void makeDeposit(double amount) = 0; //入金 }; class SavingsAccount : public BankAccount { public: void creditInterest(){ ... } }; class CheckingAccount : public BankAccount { public: ... void creditInterest(){ ... } }; int main() { list<BankAccount*> allAccounts; SavingsAccount s; CheckingAccount c; allAccounts.push_back(&s); allAccounts.push_back(&c); for (list<BankAccount*>::iterator p = allAccounts.begin(); p != allAccounts.end(); ++p ) { if (SavingsAccount *psa = dynamic_cast<SavingsAccount*>(*p)) { psa->creditInterest(); } else if (CheckingAccount *psa = dynamic_cast<CheckingAccount*>(*p)) { psa->creditInterest(); } else { error(); } }
この書き方だと、BankAccountのサブクラスを新しく定義したとき、新しいif文を追加する必要があります。
なので、できる限り仮想関数を使います。