为什么继承

-----------------siwuxie095

   

   

   

   

   

   

   

   

什么是继承?

   

在现实生活中,继承的例子有很多,如:儿子继承了父亲的房产 财产

   

   

   

   

   

不过这些和三胖继承二胖王位,继而统治整个国家的传奇故事相比,

恐怕也就弱爆了

   

   

   

   

看完现实中的继承,再来看 C++ 中的继承,二者完全不等同

   

   

   

   

   

   

   

看如下实例:

   

先定义一个人类:Person,人有名字、年龄,还要吃饭

   

   

   

   

再定义一个工人类:Worker,工人是人的一种,不仅有名字、

年龄、要吃饭,还要工作和挣工资

   

   

   

不难发现:作为工人来说,它具有比人更多的属性,而且

在代码中,工人类也具有人类中所有的代码特征

   

既然人类中的所有数据成员和成员函数放在工人类中都适用,

能不能让人类和工人类产生某种关系,从而在定义时,不重

复写这些代码,减轻程序员的工作呢?

   

其实,这在 C++ 中是可以的,但即便如此,也是有前提条

件的,即 发生关系的两个类必须具备包含关系

   

   

   

工人类在概念上完全属于人类,即 人类在概念上是工人类

超集,工人类是人类的 子集

   

   

   

   

有了这样的概念关系,就可以将程序优化成这样:

   

   

   

工人类在继承人类之后,在自己的类定义中就不需要再写人类的

所有内容了,只需写出自己特有的内容即可

   

当工人类和人类发生了继承关系后,就称 工人类 人类 派生类

人类 工人类 基类,或称 工人类 人类 子类,人类

人类 父类

   

   

   

概念是两两配对的,要对应使用,不能混搭:

   

   

   

   

   

内存中的对象

   

人类和工人类在实例化后,每个对象在内存中的数据分布:

   

   

   

在内存中,人类如果实例化一个对象,会有两个数据成员:姓名和年龄,

而工人类在实例化一个对象后,虽然没有定义姓名和年龄,但因为工人

类继承了人类,所以由工人类实例化的对象中,就已经包含了人类的两

个数据成员:姓名和年龄,同时还有一个自己特有的数据成员:工资

   

   

 

   

程序:

   

Person.h:

   

#include <string>

using namespace std;

   

   

class Person

{

public:

Person();

~Person();

void eat();

public:

string m_strName;

int m_iAge;

};

   

   

   

Person.cpp:

   

#include "Person.h"

#include <iostream>

using namespace std;

   

   

Person::Person()

{

cout << "Person()" << endl;

}

   

Person::~Person()

{

cout << "~Person()" << endl;

}

   

void Person::eat()

{

cout << "eat()" << endl;

}

   

   

   

Worker.h:

   

#include "Person.h"

//公有继承 写上关键字 public

class Worker:public Person

{

public:

Worker();

~Worker();

void work();

public:

int m_iSalary;

};

   

   

   

Worker.cpp:

   

#include "Worker.h"

#include <iostream>

using namespace std;

   

   

Worker::Worker()

{

cout << "Worker()" << endl;

}

   

Worker::~Worker()

{

cout << "~Worker()" << endl;

}

   

void Worker::work()

{

cout << "work()" << endl;

}

   

   

   

main.cpp:

   

#include<stdlib.h>

#include "Worker.h"

using namespace std;

   

int main(void)

{

//要实例化子类,必然要先实例化父类(隐性)

//即先执行父类的构造函数,再执行子类的构造函数

//析构函数的执行顺序则相反

Worker *p = new Worker();

//子类对象可以访问父类的数据成员

p->m_strName = "Jim";

p->m_iAge = 10;

p->m_iSalary = 1000;

//子类对象可以访问父类的成员函数

p->eat();

p->work();

delete p;

p = NULL;

system("pause");

return 0;

}

   

   

运行一览:

   

   

   

   

   

   

   

   

   

   

   

【made by siwuxie095】

原文地址:https://www.cnblogs.com/siwuxie095/p/6799441.html