| 基類成員 | public 繼承 | protected 繼承 | private 繼承 |
|---|---|---|---|
| public | public | protected | private |
| protected | protected | protected | private |
| private | 不可訪問 | 不可訪問 | 不可訪問 |
class Point { public: Point(double a,double b,double c){...} double Getx(){return x;} ... private: double x,y,z; };
class Line: public Point { // 或 protected Point
public: Line(...):Point(...){...} void show(){ cout<
例 2:private 繼承與接口轉發
class Rectangle: private Point {
public: void move(int xoff,int yoff){ Point::move(xoff,yoff); }
int Getx(){ return Point::Getx(); } // 必須顯式調用基類作用域
};
// 派生類對象調用基類同名成員:obj.Base::func()
// 派生類成員函數中調用:Base::func()
支配規則總結
- 基類無法訪問派生類成員
- 同名成員優先派生類,需加基類作用域訪問基類版本
- 指針/引用的靜態類型決定可訪問成員範圍(切片現象)
- 友元不繼承
指針賦值陷阱
Base *pb = &derived_obj;
pb->f1(); // 調用 Base::f1(),因為 pb 靜態類型為 Base*
// 即使 Derived 覆蓋了 f1(),非虛函數不會多態
虛函數才能實現動態綁定,這是多態的前提。