結論:可以。 基類的 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 int s_data; 重新定義 (遮蔽)。靜態成員繼承行為與非靜態成員一致,掌握存取修飾詞即可正確使用。