快轉到主要內容

2026 03 11

·195 字·1 分鐘
Wilson Lin
作者
Wilson Lin
A little bit about you

C++ Access Specifier for Inheritance
#

C++中經常看到繼承都會加上public

class B : public A{
    // ...
}

之前都沒有特別去記是什麼意思,趁者這學期修物件導向遇到的問題趕快來複習一下

繼承也可以分成 public protected private

  1. public => A 的所有成員到 B中都保持原樣
  2. protected => A 的public到 B變成 protected 其餘不變
  3. private => A 的所有成員到 B都是private

C++ 子類別如何呼叫父類別的函數
#

沒有同名的函數 => 可以直接呼叫
#

class Parent {
public:
    void sayHello() { cout << "Hello from Parent"; }
};

class Child : public Parent {
public:
    void test() {
        sayHello(); // 直接呼叫,沒問題!
    }
};

有同名的函數 => 使用範圍解析運算子 ::
#

class Parent {
public:
    void work() { cout << "Parent is working..." << endl; }
};

class Child : public Parent {
public:
    void work() {
        // 如果只寫 work(); 會造成無窮遞迴(呼叫到自己)
        Parent::work(); // 成功呼叫父類別的版本
        cout << "Child is also working!" << endl;
    }
};

其他or容易忘記的
#

  • C++要使用多型 一定要加virtual
  • 類別有被繼承的話 Destructor 也要加virtual避免Memory Leak
class Parent {
    ~Parent() { cout << "Parent Bye\n"; }
    void speak() { cout << "Parent Speak\n"; }
};

class Child : Parent {
    ~Child() { cout << "Child Bye\n"; }
    void speak() { cout << "Child Speak\n"; }
};

int main() {
    Child c; 
    cout << "--- Start ---\n";
    ((Parent)c).speak(); // <--- 陷阱發生處
    cout << "--- End ---\n";
}
  • ((Parent)c).speak(); 這行會在記憶體中開一個暫時物件複製c的內容 然後裁切成Parent的大小 且這行執行完生命週期就結束了 會被釋放 所以Destructor會被呼叫