虛函數的訪問控制(public/protected/private)僅在編譯期靜態綁定階段生效;運行期多態調用通過虛函數表動態分發,**不受派生類覆蓋函數訪問修飾符限制**。
class Base {
public:
virtual void f(int i = 0) { cout << "Base: " << i << endl; }
};
class Derived : public Base {
private:
void f(int i = 1) { cout << "Derived: " << i << endl; }
};
int main() {
Base *b = new Derived();
b->f(); // 輸出: Derived: 0
}
class Base {
private:
virtual void f() { cout << "Base" << endl; }
};
class Derived : public Base {
public:
void f() { cout << "Derived" << endl; }
};
int main() {
Base *b = new Derived();
// b->f(); // 編譯錯誤:Base::f 是 private,靜態類型 Base* 不可訪問
}
編譯直接失敗,因為靜態類型 `Base*` 看不到 `f`。即使動態類型有 public `f`,也無法調用。
C++ FAQ: "Virtual functions and access control" — 訪問控制不影響虛函數覆蓋與動態分發。