- Header.h の 34 行目に public: を追加する
- Source.cpp の 40行目を次のようにする
mons2.AddToAbility(reinterpret_cast<CardGrant>(&cMonster1::Ability));
これでコンパイルエラーはなくなります。
cMonster1::Ability は、自分の hp を 1減らす機能ですね。
mons2.AddToAbility(reinterpret_cast<CardGrant>(&cMonster1::Ability));
の実行で、mons2 の Grant に cMonster1::Ability
という「メンバ関数」を登録できました。
mons2 が mons1 の能力を獲得したつもりですね。
しかし、mons2.Preparition(); では
登録状況の確認だけで、何も実行していません。
登録したメンバ関数を実行していないのです。
mons2.Test(); では、何も変更されていない mons2 の
hp を表示して、それは 1 です。
では、Preparition() で、登録したメンバ関数を
実行すればよいということになります。そこで
コード:
void cCard::Preparition()
{
for (auto v : Grant)
(this->*v)();
}
mons2.Preparition(); で呼び出すと、this は mons2 を
指していますから mons2 の hp が 1 減りそうです。
ところが、this が mons2 を指しているので、this->*v は
cMonster2::Ability です。cMonster2 は Ability を
オーバーライドしていないので cCard::Ability が呼び出され、
結局何もしません。