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;  // 可以,'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