C++ 繼承:初學者指南
你好,未來的 C++ 巫師們!今天,我們將進入 C++ 繼承的奇妙世界。如果你是編程新手,不必擔心——我將成為你友善的導遊,我們將一步步來。在這篇教程結束時,你會驚訝於你所學到的!
繼承是什麼?
在我們深入之前,讓我們從一個簡單的類比開始。想象你正在創建一個家譜。正如孩子從父母那裡繼承特質一樣,在 C++ 中,類可以從其他類繼承屬性和行為。很酷,對吧?
繼承是面向對象編程中的一個基本概念,它允許我們根據現有的類來創建新的類。這有助於代碼重用並幫助我們以分層結構組織代碼。
基礎類和派生類
在 C++ 繼承的世界中,我們主要有兩個角色:基礎類和派生類。
基礎類
基礎類(也稱為父類或超類)是其他類繼承的類。它是我們家譜類比中的祖先。
讓我們創建一個簡單的基礎類:
class Animal {
public:
void eat() {
cout << "這個動物正在吃。" << endl;
}
void sleep() {
cout << "這個動物正在睡覺。" << endl;
}
};
在這個例子中,Animal
是我們的基礎類。它有兩個方法:eat()
和 sleep()
。這些是大多數動物共有的常見行為。
派生類
派生類(也稱為子類或子類)是從基礎類繼承的類。它是我們家譜中的後代。
讓我們創建一個派生類:
class Dog : public Animal {
public:
void bark() {
cout << "汪!汪!" << endl;
}
};
在這裡,Dog
是我們的派生類。它繼承自 Animal
,因此自動擁有 eat()
和 sleep()
方法。我們還添加了一個新的方法 bark()
,這是狗特有的。
現在,讓我們看看如何使用這些類:
int main() {
Dog myDog;
myDog.eat(); // 輸出:這個動物正在吃。
myDog.sleep(); // 輸出:這個動物正在睡覺。
myDog.bark(); // 輸出:汪!汪!
return 0;
}
這不是太驚人了嗎?我們的 Dog
類可以在不重新編寫它們的情況下使用 Animal
類的方法!
存取控制和繼承
現在,讓我們談談在我們的 C++ 家庭中誰可以看到什麼。就像在真實家庭中一樣,有些事情是公眾所知的,有些是家庭成員專用的,有些則是個人秘密。
在 C++ 中,我們有三種訪問級別:
- 公共
- 保護
- 私有
讓我們看看這些如何與繼承一起工作:
class Animal {
public:
int age;
protected:
string name;
private:
int secretCode;
};
class Dog : public Animal {
public:
void setName(string n) {
name = n; // OK, 'name' 在 Animal 中是受保護的
}
void setSecretCode(int code) {
// secretCode = code; // 錯誤!'secretCode' 在 Animal 中是私有的
}
};
在這個例子中:
-
age
是公共的,所以可以從任何地方訪問。 -
name
是受保護的,所以可以在Animal
和任何從Animal
繼承的類中訪問。 -
secretCode
是私有的,所以只能在Animal
類內訪問。
繼承類型
C++ 提供了不同的繼承風格來滿足各種需求。讓我們來探索它們!
單一繼承
這是最簡單的形式,其中一個類只繼承一個基礎類。我們已經在 Dog
示例中看到了這一點。
多層繼承
這就像一個家族血統:孫子繼承父親,父親繼承祖父。
class Animal {
public:
void eat() { cout << "吃..." << endl; }
};
class Mammal : public Animal {
public:
void breathe() { cout << "呼吸..." << endl; }
};
class Dog : public Mammal {
public:
void bark() { cout << "叫..." << endl; }
};
int main() {
Dog myDog;
myDog.eat(); // 從 Animal
myDog.breathe(); // 從 Mammal
myDog.bark(); // 從 Dog
return 0;
}
層次繼承
當多個類繼承自單個基礎類時,就是層次繼承。想想看,這就像家庭中的兄弟姐妹。
class Animal {
public:
void eat() { cout << "吃..." << endl; }
};
class Dog : public Animal {
public:
void bark() { cout << "叫..." << endl; }
};
class Cat : public Animal {
public:
void meow() { cout << "喵喵..." << endl; }
};
多重繼承
多重繼承是一個類從多個基礎類繼承。這就像從你的父母那裡繼承特質!
class FlyingCreature {
public:
void fly() { cout << "飛..." << endl; }
};
class SwimmingCreature {
public:
void swim() { cout << "游泳..." << endl; }
};
class Duck : public FlyingCreature, public SwimmingCreature {
public:
void quack() { cout << "嘎嘎..." << endl; }
};
int main() {
Duck myDuck;
myDuck.fly(); // 從 FlyingCreature
myDuck.swim(); // 從 SwimmingCreature
myDuck.quack(); // 從 Duck
return 0;
}
但是要小心!如果不謹慎使用,多重繼承可能會導致著名的“鑽石問題”。
繼承方法表格
以下是總結我們討論的繼承方法的有用表格:
繼承類型 | 描述 | 示例 |
---|---|---|
單一 | 一個類繼承自一個基礎類 | Dog : public Animal |
多層 | 一個類繼承自一個派生類 | Dog : public Mammal, Mammal : public Animal |
層次 | 多個類繼承自單個基礎類 | Dog : public Animal, Cat : public Animal |
多重 | 一個類繼承自多個基礎類 | Duck : public FlyingCreature, public SwimmingCreature |
就是這樣,大家!我們已經涵蓋了 C++ 繼承的基礎知識。記住,練習成就完美,所以不要害怕實驗這些概念。編程愉快,願繼承與你同在!
Credits: Image by storyset