一、类之间的关系
(1)has:包含关系,用以描述一个类由多个“部件类”构成。实现has-A关系用类成员表示,即一个类中的数据成员是另一种已经定义的类
(2)use:一个类部分地使用另一个类。通过类之间成员函数的相互联系,定义友员或对象参数传递实现。
(3)is:机制称为“继承”。关系具有传递性,不具有对称性
二、继承关系
继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承类似,例如儿子继承父亲的财产。
继承(Inheritance)可以理解为一个类从另一个类获取成员变量和成员函数的过程。例如类 B 继承于类 A,那么 B 就拥有 A 的成员变量和成员函数。被继承的类称为父类或基类,继承的类称为子类或派生类。
派生类除了拥有基类的成员,还可以定义自己的新成员,以增强类的功能。
以下是两种典型的使用继承的场景:
1) 当你创建的新类与现有的类相似,只是多出若干成员变量或成员函数时,可以使用继承,这样不但会减少代码量,而且新类会拥有基类的所有功能。
2) 当你需要创建多个类,它们拥有很多相似的成员变量或成员函数时,也可以使用继承。可以将这些类的共同成员提取出来,定义为基类,然后从基类继承,既可以节省代码,也方便后续修改成员。
三、继承概念
1、继承
- 继承是使用已经编写好的类来创建新类,新的类具有原有类的所有属性和操作,也可以在原有类的基础上做一些修改和增补。
- 新类称为派生类或者子类,原有类称为基类或父类
- 派生类是基类的具体化
2、继承的语法声明
派生类(子类)的声明语法为:
class 派生类名:继承方式 基类名(父类名)
{
派生类新增成员的声明;
}
3、继承的一些性质
- 子类拥有父类的所有成员变量和成员函数
- 子类可以拥有父类没有的方法和属性
- 子类就是一种特殊的父类
- 子类对象可以当作父类对象使用
示例程序
#include <iostream>
using namespace std;
class Animal
{
public:
void init(int age, char *name)
{
this->age = age;
this->name = name;
}
// 吃饭
void eat()
{
cout << "动物: " << name << "在吃饭" << endl;
}
void sleep()
{
cout << "动物: " << name << "在睡觉" << endl;
}
void print()
{
printf("age = %d, name = %s\n", age, name);
}
private:
int age;
char *name;
};
// 猫 继承动物 将继承动物的所有成员变量和成员函数
// A 继承 B : class A : 继承权限 继承的类 ====> class A: public B
// 被继承的类 B : 基类 或者 父类
// 继承的类 A : 派生类 或者 子类
// 派生类可以扩展自己的功能
class Cat : public Animal
{
public:
void CatchM()
{
cout << "猫在捉老鼠" << endl;
}
};
class Dog :public Animal // fork
{
public:
void lookHome()
{
cout << "狗在看家" << endl;
}
};
int main()
{
Animal a;
a.init(10, "大熊猫");
a.print();
a.eat();
a.sleep();
Cat c;
c.init(3, "波斯猫");
c.print();
c.eat();
c.sleep();
c.CatchM();
Dog d;
d.init(4, "哈士奇");
d.print();
d.eat();
d.sleep();
d.lookHome();
return 0;
}
执行结果:
age = 10,name = 大熊猫
动物: 大熊猫在吃饭
动物: 大熊猫在睡觉
age = 3,name = 波斯猫
动物: 波斯猫在吃饭
动物: 波斯猫在睡觉
猫在捉老鼠
age = 4,name = 哈士奇
动物: 哈士奇在吃饭
动物: 哈士奇在睡觉
狗在看家