C++面向对象核心:什么是类的继承?
——从“孩子继承父母”理解 C++ 继承机制
对于小学生,可以先记一句话:
继承,就是让一个新的类拥有另一个已有类的功能,并且可以增加自己新的功能。
就像现实生活:
爸爸 ↓ 孩子孩子可以继承爸爸的一些特点,同时拥有自己的特点。
在 C++ 中:
基类(父类) ↓ 派生类(子类)一、为什么需要继承?
假设我们写一个动物程序。
有:
class Dog { }; class Cat { };狗和猫都有:
年龄
名字
吃东西
睡觉
如果每个类都写一遍:
class Dog { public: int age; void eat() { } }; class Cat { public: int age; void eat() { } };会发现:
大量重复。
程序员想:
能不能把共同的东西放一起?
于是有了:
继承。
二、先创建一个父类(基类)
例如:
class Animal { public: int age; void eat() { cout << "吃东西" << endl; } };Animal:
表示:
“所有动物都有的东西”。
然后:
狗:
class Dog : public Animal { };这里:
:表示:
继承。
public Animal表示:
Dog公开继承Animal。
关系:
Animal | | Dog三、继承以后,Dog有什么?
虽然 Dog 类里面什么都没有:
class Dog : public Animal { };但是:
Dog自动拥有:
int age;和:
eat()例如:
int main() { Dog d; d.age = 3; d.eat(); }输出:
吃东西为什么?
因为:
Dog继承了Animal。
四、继承的本质是什么?
很多小朋友会误解:
Dog里面没有代码,为什么有功能?
实际上:
继承以后:
Dog对象里面包含:
+----------------+ | Animal部分 | | | | age | | eat() | +----------------+ | Dog自己的部分 | +----------------+也就是说:
子类对象里面包含父类部分。
五、父类和子类的专业名字
C++中:
| 生活 | C++ |
|---|---|
| 爸爸 | 基类(Base Class) |
| 孩子 | 派生类(Derived Class) |
| 继承 | Inheritance |
例如:
class Dog : public Animal { };Animal:
基类。
Dog:
派生类。
六、派生类可以增加自己的功能
继承不是简单复制。
例如:
动物:
class Animal { public: void eat() { cout<<"吃东西"<<endl; } };狗:
class Dog : public Animal { public: void bark() { cout<<"汪汪叫"<<endl; } };现在:
Dog拥有:
父类:
eat()自己:
bark()使用:
Dog d; d.eat(); d.bark();输出:
吃东西 汪汪叫七、继承中最重要的三个权限
继承有三种方式:
class Dog : public Animal还有:
class Dog : protected Animal和:
class Dog : private Animal对于初学者:
重点掌握:
public继承
八、public继承是什么意思?
看:
class Animal { public: int age; protected: int weight; private: string name; };然后:
class Dog : public Animal { };结果:
| 父类成员 | Dog能否直接使用 |
|---|---|
| public | 可以 |
| protected | 可以 |
| private | 不可以 |
例如:
class Animal { public: int age; private: string name; }; class Dog:public Animal { }; int main() { Dog d; d.age=5; //可以 d.name="旺财"; //错误 }为什么?
因为:
private是父类自己的秘密。
九、为什么父类private不能被子类访问?
可以理解:
爸爸有一个私人日记:
爸爸 公开: 身高 保护: 钱包 私密: 日记孩子可以知道:
身高。
可能知道:
钱包。
但是:
不能直接打开:
爸爸日记。
所以:
private成员:
子类也不能访问。
十、构造函数和继承
这是考试重点。
例如:
class Animal { public: Animal() { cout<<"Animal构造"<<endl; } }; class Dog:public Animal { public: Dog() { cout<<"Dog构造"<<endl; } };创建:
Dog d;执行顺序:
先:
Animal构造再:
Dog构造为什么?
因为:
Dog身体里面先有Animal部分。
所以:
先造爸爸。
再造孩子。
十一、析构函数顺序
刚好相反。
创建:
Animal构造 ↓ Dog构造销毁:
Dog析构 ↓ Animal析构口诀:
构造:先父后子
析构:先子后父
十二、继承和普通包含有什么区别?
很多孩子容易混淆:
继承:
"is-a"
意思:
“是一个”
例如:
Dog 是 Animal所以:
Dog : Animal包含:
"has-a"
意思:
“拥有一个”
例如:
汽车:
Car | |-- Engine汽车不是发动机。
所以:
不是继承。
十三、一个完整例子
#include<iostream> using namespace std; class Animal { public: string name; void eat() { cout<<"动物吃东西"<<endl; } }; class Dog:public Animal { public: void bark() { cout<<"狗叫汪汪"<<endl; } }; int main() { Dog d; d.name="旺财"; d.eat(); d.bark(); return 0; }运行:
动物吃东西 狗叫汪汪十四、记忆总结
什么是继承?
一句话:
继承就是子类自动获得父类已有的属性和函数,并且可以增加自己的功能。
继承关系:
父类 Animal | | 子类 Dog三个核心:
1. 子类拥有父类功能
Dog d; d.eat();2. 子类可以扩展
d.bark();3. 创建顺序
构造: 父 → 子 析构: 子 → 父十五、和后面虚函数的联系
学习到这里,后面会遇到:
Animal *p; Dog dog; p=&dog;为什么:
父类指针可以指向子类对象?
为什么需要:
virtual这就是 C++ 面向对象的:
多态(Polymorphism)
所以:
继承是 C++ 三大面向对象特性之一:
封装 ↓ 继承 ↓ 多态理解继承,是学习虚函数、抽象类、设计模式的基础。