1、继承的概念和意义

此文编写参考狄泰软件学院唐佐林老师的视频课程

一、继承在生活中的意义:

有句话叫做龙生龙,凤生凤,老鼠的儿子会打洞,龙生的儿子自热长的像龙,这是长相相似,当然做不到完全一样,也可说特征相似,老鼠的儿子会打洞,打洞这是一种行为,老鼠的儿子就是继承了老鼠爸爸的打洞行为,所以说继承在生活中可以看成是特征的获取和行为的获取。

二、类与类之间有哪些关系?

在讲继承之前先讲一下类与类之间有哪些关系?组合关系和继承关系,接下来将先讲组合关系,因为继承关系比组合关系要复杂,能用组合关系描述实际问题时就用组合关系来解决,尽量使程序简单化,从而减少bug。

1、组合关系

(1)什么是组合关系呢?
组合关系其实就是整体和部分的关系,例如我们将电脑看成是一个类,那么电脑这个类是由其他类组合而成的,如电脑类是由硬盘类、内存类、显卡类等各种小类组合而成的,如缺乏了硬盘类那么电脑就无法正常工作。
(2)下面用一个简单实例说明组合关系,下面的电脑类当然不止包含内存类和cpu类,但是只是为了说明这种思想,所以此处简化一下程序。

#include<iostream>
#include<string>
using namespace std;

class Memory
{
public:
	Memory()
	{
		cout<<"Memory()"<<endl;
	}
	~Memory()
	{
		cout<<"~Memory()"<<endl;
	}
};
class CPU
{
public:
	CPU()
	{
		cout<<"CPU()"<<endl;
	}
	~CPU()
	{
		cout<<"~CPU()"<<endl;
	}
};
class Computer
{
private:
	Memory memory;
	CPU cpu;
public:
	Computer()
	{
		cout<<"Computer()"<<endl;
	}
	void power()
	{
		cout<<"void power()"<<endl;
	}
	void reset()
	{
		cout<<"void reset()"<<endl;
	}
	~Computer()
	{
		cout<<"~Computer()"<<endl;
	}
};
int main()
{
	Computer c1;
	return 0;
}

运行结果:
在这里插入图片描述
分析:在创建电脑c1这个对象时,那么就先调用了Memory和CPU这个类的构造函数,然后再调用Computer类的构造函数,这个过程就类似于一个电脑的组装过程,之后析构的时候是逆着顺序来进行析构的,但是它们的生命周期是相同的,换句话说就是同生死的。

小结:组合关系的特点

  1. 将其他类的对象作为当前类的成员使用
  2. 当前类的对象和成员对象的生命周期相同
  3. 成员对象在用法上与普通对象完全一致

2、继承关系

(1)什么是继承关系呢?
继承关系也即是父子关系,此处同样举电脑的例子。我们生活中的电脑有许多的品牌,如惠普电脑、苹果电脑等,这些各种品牌的电脑都可以看成是电脑的特化实例,也就是它们之间是存在一种单向的关系的,我们可以说惠普电脑是电脑,但是不能够说电脑就是惠普电脑,也即是惠普等各种品牌的电脑一定有电脑的特征,一定会有硬盘、内存等等,但是我们说的电脑概念是不一定有惠普、苹果等电脑的特征的,因为这种关系是单向的。
从上面就可将这种关系引申为继承关系中的父类和子类了,这种关系具有哪些特征呢?下面来做个小结。

  1. 子类拥有父类的所有属性和行为
  2. 子类就是一种特殊的父类
  3. 子类对象可以当做父类对象使用
  4. 子类中可以添加父类中没有的方法和属性

(2)下面用一个简单实例说明继承关系

#include<iostream>
#include<string>
using namespace std;
class Parent//父类
{
private:
	int value;//属性
public:
	Parent()
	{
		cout<<"Parent()"<<endl;
		value=100;
	}
	void func()//行为
	{
		cout<<"value="<<value<<endl;
	}
};
class Child:public Parent//子类,继承Parent
{

};
int main()
{
	Child c1;
	c1.func();	
	return 0;
}

运行结果:
在这里插入图片描述
分析:程序中子类Child里面是空着写的,并没有写上任何的代码,但是创建c1对象时却可以调用父类的func函数,并且此时父类的构造函数也被自动调用了,这也说明了子类对父类的继承关系,子类从父类那里继承了所有的属性和行为,属性就是父类中的私有的成员,行为就是父类中的成员函数,本质上来说这是一种代码复用。

(3)几个重要规则:

  1. 子类就是一个特殊的父类
  2. 子类对象可以直接初始化父类对象
  3. 子类对象可以直接赋值给父类对象
    下面通过对上例的修改来验证这几条重要规则。
#include<iostream>
#include<string>
using namespace std;
class Parent
{
private:
	int value;
public:
	Parent()
	{
		cout<<"Parent()"<<endl;
		value=100;
	}
	void func()
	{
		cout<<"value="<<value<<endl;
	}
};
class Child:public Parent
{
public:
	void hello()
	{
		cout<<"I am a child"<<endl;
	}
};

int main()
{
	Child c1;
	c1.func();	
	c1.hello();

	Parent p1=c1;//子类对父类进行初始化操作
	Parent p2;
	p2=c1;//子类对父类进行赋值操作
	return 0;
}

运行结果:
在这里插入图片描述
分析:从结果可以得知程序是可以正常编译的,也就是说这几条重要规则是成立的。

三、综合实例

下面用电脑的例子来说明下组合关系和继承关系的混合使用。

#include<iostream>
#include<string>
using namespace std;
//描述一个电脑的组装过程,在c++中用组合关系来去描述
class Memory
{
public:
	Memory()
	{
		cout<<"Memory()"<<endl;
	}
	~Memory()
	{
		cout<<"~Memory()"<<endl;
	}
	
};
class Mainboard
{
public:
	Mainboard()
	{
		cout<<"Mainboard()"<<endl;
	}
	~Mainboard()
	{
		cout<<"~Mainboard()"<<endl;
	}
	
};
class Disk
{
public:
	Disk()
	{
		cout<<"Disk()"<<endl;
	}
	~Disk()
	{
		cout<<"~Disk()"<<endl;
	}
	
};
class CPU
{
public:
	 CPU()
	{
		cout<<"Mainboard()"<<endl;
	}
	~CPU()
	{
		cout<<"~ CPU()"<<endl;
	}
	
};
class Computer
{
private:
	Memory memory;
	Disk disk;
	Mainboard mainboard;
	CPU cpu;
public:
	Computer()
	{
		cout<<"computer has been assembled"<<endl;	
	}
	~Computer()
	{
		cout<<"taking apart the computer"<<endl;	
	}
	
};
//下面用继承关系来去描述各种品牌的电脑

//惠普电脑
class HPBook:public Computer
{
private:
	string OS;
public:
	HPBook()
	{
		OS="windows 10";//预装Windows操作系统
	}
	void install_OS(string OS)
	{
		this->OS=OS;//自己安装系统
	}
	void OS_Name()
	{
		cout<<OS<<endl;//打印该电脑的操作系统
	}
};
//苹果电脑
class MacBook:public Computer
{
private:
	string OS;
public:
	MacBook()
	{
		OS="Mac OS";//预装的就是Mac系统
	}
	void OS_Name()
	{
		cout<<OS<<endl;//打印该电脑的操作系统
	}
};
int main()
{
	HPBook hp;//创建惠普电脑的实体对象
	hp.OS_Name();//默认Windows10系统,所以打印该系统名
	hp.install_OS("Ubuntu 16.04");//自己安装Ubuntu 16.04
	hp.OS_Name();
	cout<<endl;
	MacBook mac;//创建苹果电脑的实体对象
	mac.OS_Name();
	return 0;
}

运行结果如下:
在这里插入图片描述

四、总结

  1. 继承是面向对象中类之间的一种关系
  2. 子类拥有父类的所有属性和行为
  3. 子类对象可以当作父类对象使用
  4. 子类中可以添加父类没有的方法和属性
  5. 继承是面向对象中代码复用的重要手段
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页