יש כמה דרכים
אבל אני מניח שאתה מחפש דרך שתתבצע בזמן קומפילציה, נכון? בספר More Effective C++ יש תיאור של דרך מוצלחת לעשות זאת. באופן כללי, אתה שם "מכשול" לקומפיילר בכל צורה שבא לך. הדוגמה הכי פשוטה: הגדר ב-BASE מתודה שנקראת משהו כמו I_AM_BASE. עדיף שהיא תהיה INLINE ולא תעשה שום דבר מיוחד - אפילו כלום...מתוך ה-TEMPLATE FUNCTION, קרא למתודה הזו. מן הסתם, אם האובייקט שהעברת לא נגזר מ-BASE, הקומפיילר יזרוק הודעת שגיאה. דרך נוספת היא, בעזרת RTTI, לדאוג שהמתודה הנ"ל תחזיר את ה-TYPEID של *האב* ולא של המחלקה עצמה (שם לב: היא תחזיר את ה-TYPEID ולא את השם של המחלקה). במילים אחרות: יש ליישם מתודה ורטואלית WHO_AM_I בכל המחלקות, לפי הכלל הבא: אם המחלקה היא נגזרת, אז היא תחזיר את WHO_AMO_I של ההורה שלה (או אפילו ישירות של האב הקדמון שלה). אחרת, היא אב קדמון ולכן תחזיר את ה-TYPEID של עצמה. הפתרון השני הוא "חצי" בזמן קומפילציה, כי כל המחלקות שלא מיישמות WHO_AM_I לא יעברו קומפילציה. אבל בוודאות, גם אם מחלקה "תתחזה" ע"י יישום של מתודה כזו, היא לא יכולה להחזיר TYPEID של מחלקה הנגזרת מ-BASE.