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