首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 繼承與多態:利用 dynamic_cast 實現類型識別

     編輯:程式設計綜合問答

題目背景

給定三個類別 A、B、C,其中 B 公開繼承自 A,C 公開繼承自 B。類別 A 擁有虛解構函數。要求實現一個函數 string verify(A*),根據傳入指針指向的實際對象類型,返回 "grandpa"(A)、"father"(B)或 "son"(C)。提交的代碼只需包含 verify 函數的實現,不包含類別定義與 main 函數。

核心思路:多態與虛函數

利用 C++ 的多態機制,在基類 A 中聲明一個虛函數 getType(),並在各派生類中覆寫該函數,返回對應的字符串。verify 函數只需調用指針的 getType(),即可實現動態綁定,自動識別實際對象類型。

參考實現

#include <iostream>
#include <string>
using namespace std;

class A {
public:
    virtual ~A() {}
    virtual string getType() { return "grandpa"; }
    static string verify(A* a) { return a->getType(); }
};

class B : public A {
public:
    virtual string getType() { return "father"; }
};

class C : public B {
public:
    virtual string getType() { return "son"; }
};

// 測試代碼(提交時不包含)
int main() {
    A a; B b; C c;
    cout << A::verify(&a) << endl; // grandpa
    cout << A::verify(&b) << endl; // father
    cout << A::verify(&c) << endl; // son
    return 0;
}

關鍵點解析

  • 虛函數表:編譯器為含虛函數的類別生成虛函數表,運行時根據對象實際類型查表調用正確的覆寫函數。
  • 虛解構函數:基類必須聲明虛解構函數,確保通過基類指針刪除派生類對象時能正確調用派生類解構函數。
  • 靜態成員函數:verify 宣告為 static,便於直接通過類別名調用,無需實例化。

避坑指南

若不使用虛函數而改用 dynamic_cast 配合 RTTI,雖然可行,但會增加運行時開銷且依賴編譯器對 RTTI 的支持。虛函數方案更符合 C++ 面向對象設計原則,效率也更高。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved