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文を追加する必要があります。

なので、できる限り仮想関数を使います。