-----------------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】