C++ 繼承:初學者指南

你好,未來的 C++ 巫師們!今天,我們將進入 C++ 繼承的奇妙世界。如果你是編程新手,不必擔心——我將成為你友善的導遊,我們將一步步來。在這篇教程結束時,你會驚訝於你所學到的!

C++ Inheritance

繼承是什麼?

在我們深入之前,讓我們從一個簡單的類比開始。想象你正在創建一個家譜。正如孩子從父母那裡繼承特質一樣,在 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++ 中,我們有三種訪問級別:

  1. 公共
  2. 保護
  3. 私有

讓我們看看這些如何與繼承一起工作:

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