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

C++ 靜態成員繼承:子類別可透過作用域存取父類別 static 成員

     編輯:程式設計疑難解答

結論:可以。 基類的 static 資料成員與成員函數 (無論 public/protected/private) 皆會被子類別繼承,子類別可透過 Derived::staticMember 或 Base::staticMember 存取 (受存取修飾詞限制)。

程式碼驗證

#include <iostream>
using namespace std;

class Base {
public:
    static int s_data;
    static void s_func() { cout << "Base::s_func()\n"; }
protected:
    static int s_protected;
private:
    static int s_private;
};
int Base::s_data = 10;
int Base::s_protected = 20;
int Base::s_private = 30;

class Derived : public Base {
public:
    void test() {
        cout << "Derived::s_data = " << s_data << endl;       // 繼承 public static
        cout << "Derived::s_protected = " << s_protected << endl; // 繼承 protected static
        // cout << s_private; // 錯誤:private 不繼承 (不可存取)
        s_func(); // 繼承 public static 函數
        Base::s_func(); // 也可用基類作用域
    }
};

int main() {
    Derived d;
    d.test();
    cout << "Derived::s_data (外部) = " << Derived::s_data << endl; // 子類作用域存取
    Derived::s_func(); // 子類作用域呼叫
    return 0;
}
// 輸出:
// Derived::s_data = 10
// Derived::s_protected = 20
// Base::s_func()
// Base::s_func()
// Derived::s_data (外部) = 10
// Base::s_func()

關鍵規則總結

基類 static 成員子類別能否繼承/存取說明
public static 資料/函數✅ 是子類作用域 Derived::member 可見
protected static 資料/函數✅ 是僅子類內部可見,外部不可
private static 資料/函數❌ 否子類不可見,但基類內部方法仍操作同一份記憶體

記憶體模型

  • 靜態成員屬於 **類別**,不屬於物件。整個繼承體系共享 **同一份** 靜態資料成員記憶體 (除非子類別重新宣告同名成員造成遮蔽)。
  • Derived::s_data 與 Base::s_data 指向同一地址。

常見誤區

  • 以為 static 不會被繼承 → 錯誤,static 參與名稱查找規則,會被繼承。
  • 以為每個子類別有獨立副本 → 錯誤,除非子類別 static int s_data; 重新定義 (遮蔽)。
  • 混淆「繼承」與「存取權限」:繼承是名稱可見性,存取權限決定能否使用。

靜態成員繼承行為與非靜態成員一致,掌握存取修飾詞即可正確使用。

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