ここでは、フック関数自体が、クラスの階層にも属するデータ メンバーの typeid をチェックする必要があります。そこで、そのクラス階層のテンプレート メソッドを定義します。これは私が遭遇する混乱です:
void Person::leave() {
// code
hook(); // private virtual
// code
}
void Girl::hook() { // Girl is a derived class of Person, with data member location
// of type Location which itself has a derived class House
// code
location.locationHook(this);// what happens here depends on what kind of location she is in
// code
}
void Location::locationHook(Person* person) {
// Oh oh! This depends on what class person is
}
void House::locationHook(Person* person) {
// Oh oh! This depends on what class person is
}
したがって、この状況では、typeid(*person) と dynamic_cast を使用する独自の方法に頼る必要があります。また、Person 派生クラスの各タイプに対して if ステートメントを使用して、仮想 locationHook を定義する必要があります。