C++ Access Specifier for Inheritance#
C++中經常看到繼承都會加上public
class B : public A{
// ...
}
之前都沒有特別去記是什麼意思,趁者這學期修物件導向遇到的問題趕快來複習一下
繼承也可以分成 public protected private
- public => A 的所有成員到 B中都保持原樣
- protected => A 的public到 B變成 protected 其餘不變
- 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會被呼叫
