實現 string verify(A* a),根據傳入指針指向的實際類型返回:
A → "grandpa"B : public A → "father"C : public B → "son"string verify(A* a) {
A* a1 = dynamic_cast<A*>(a); // 無意義,永遠成功
B* b1 = dynamic_cast<B*>(a); // 缺少模板參數
C* c1 = dynamic_cast<C*>(a); // 缺少模板參數
if (a1) return "grandpa"; // 順序錯誤,父類先匹配導致子類永不命中
if (b1) return "father";
if (c1) return "son";
}
string verify(A* a) {
// 從最派生類向基類檢查
if (dynamic_cast<C*>(a)) return "son";
if (dynamic_cast<B*>(a)) return "father";
return "grandpa"; // 只有 A 對象走到這裡
}
dynamic_cast<TargetType*>(sourcePtr),模板參數不可省略。/GR VC++, -frtti GCC),且類必須有虛函數(題目中 A 有虛析構)。nullptr 時 dynamic_cast 返回 nullptr,上述邏輯會返回 "grandpa",如需區分可先判空。若極度敏感,可用 虛函數分發 避免 RTTI 開銷:
class A { public: virtual string verify() { return "grandpa"; } virtual ~A(){} };
class B : public A { public: string verify() override { return "father"; } };
class C : public B { public: string verify() override { return "son"; } };
string verify(A* a) { return a->verify(); } // 雙分發,O(1) 虛表查找