前面说到C++类的名字自定义要有含义,成员函数名也同样如此。

一个好的程序员除了让自己能看懂代码外,那是能力,也能让别人看懂,那是本事。

我们来看第一个特性:继承!

什么是继承?

小编不说概念性的定义,先举两个例子:

1、你的身体流淌着的是父母的血统。

2、你能学到老师的知识。

能看出什么来?自己体会。

那么在C++中如何继承呢?

我们再创建一个类Teacher.h和Teacher.cpp两个文件。

Teacher.h:

#ifndef      __Teacher_h__
#define __Teacher_h__ class Teachar
{
public:
Teachar();
~Teachar(); public: //公有的属性或成员 int get_KnowLedge()const;              //获取知识 char *get_Name()const;               //获取名字 int get_Age()const;                 //获取年龄 void print_information();             //打印所有的信息
int t_knowledeg; //知识
int t_age; //年龄
char *t_name; //名字 protected: //受保护的属性或成员 private: //私有属性或成员
};

Teacher.cpp

#include "Teacher.h"
#include <iostream>
using namespace std; //构造函数
Teachar::Teachar()
{
this->t_name = "visiousdragon";
this->t_age = 29;
this->t_knowledeg = 100;
} Teachar::~Teachar()
{
} //获取知识
int Teachar::get_KnowLedge() const
{
return this->t_knowledeg;
} //获取名字
char * Teachar::get_Name() const
{
return this->t_name;
} //获取年龄
int Teachar::get_Age() const
{
return this->t_age;
} //获取信息
void Teachar::print_information()
{
cout << this->get_Name() << "\t"
        << this->get_Age() << "\t"
        << this->get_KnowLedge() << endl;
}

创建好了后,我们来继承Teacher类.

打开前面创建的Student.h头文件:

#ifndef  __STUDENT_H__			//if not define 的简写,防止你创建的头文件是否被宏重复定义
#define __STUDENT_H__ #include "Teacher.h" //自定义Student类
class Student
:public Teachar  /*,public Teacher2*/    //这就是继承Teacher的写法,当然也能多继承其他的类,只需要逗号隔开即可。注意:当开发时最好别继承太多的父类,以后你会懂。
{
public:
Student(); //构造函数
~Student(); //析构函数 public: //公有的属性或成员 protected: //受保护的属性或成员 private: //私有属性或成员 };
#endif // ! __STUDENT_H__

既然一切就绪,那我们来看看继承如何实现的。我们Student类内部可是什么都没有写的。

打开主体源文件:

#include <iostream>
#include "Teacher.h"
#include "Student.h"
using namespace std; int main()
{
Student student1; //子类(派生类)继承了Teacher的成员函数,实例化也称创建一个类对象
student1.print_information(); Student *student2 = new Student; //子类(派生类)继承了Teacher的成员函数,实例化也称生成一个类指针对象
student2->print_information(); Teachar *teahcer=&student1; //子类对象引用给父类指针对象,相当于前面学得指针赋值int *p=&number;
teahcer->print_information(); system("pause");
return 0;
}

打印得结果是相同得,那我们就有一个疑惑,什么是继承?通俗得讲:继承(Inheritance)可以理解为一个类从另一个类获取成员变量和成员函数的过程。

有人会问了,子类难道什么都不做吗,只管调用?那怎么可能呢!

子类(派生类)继承了父类(基类),除了继承了父类得成员变量和成员函数外,也可以有自己的成员变量和成员函数。

我们再来看看全新得Student.h头文件内部:

#ifndef  __STUDENT_H__			//if not define 的简写,防止你创建的头文件是否被宏重复定义
#define __STUDENT_H__ #include "Teacher.h" //自定义Student类
class Student
:public Teachar
{
public:
Student(); //构造函数
~Student(); //析构函数 public: //公有的属性或成员
void getTeacherInformation();
char *getTeacherName()const;
int getTeacherAge()const;
int getTeacherKnowledge()const;
protected: //受保护的属性或成员 private: //私有属性或成员
Teachar *teacher;    //将父类指针对象作为Student类的成员变量
};
#endif // ! __STUDENT_H__

再看看全新Studnet.cpp文件内部:


主体源文件:

#include <iostream>
#include "Student.h"
using namespace std; int main()
{
Student student1; //子类(派生类)继承了Teacher的成员函数
student1.getTeacherInformation(); system("pause");
return 0;
}

运行看看,还是可以得到Teacher类内部的数据,不过调用的函数却是Student内部的函数,这就能肯定一点,Student类作为子类时,它可以继承父类的成员变量、函数,也可以拥有自己的成员变量、函数。

有人会奇怪,为什么要在Student构造函数内部实例化Teacher的对象,因为它作为一个Student的成员变量,不实例化(初始化)这个对象,下面的三个函数就无法使用:

...
char *Student::getTeacherName()const
{
return teacher->get_Name();
}
int Student::getTeacherAge()const
{
return teacher->get_Age();
}
int Student::getTeacherKnowledge()const
{
return teacher->get_KnowLedge();
}
...

不信的可以试试,肯定为空,报出异常。

也有人会奇怪,有的地方为什么写this->调用函数,这句this->代表就是当前所在的类指针对象,什么意思?

说白了,它比结构体更简练,每个类都有一个看不见的指针对象,就是它本身,在Student内部使用就代表Student 的指针对象。

当然说到这里不得不提一点,子类继承父类时,执行子类成员函数、构造函数、析构函数,或父类的成员函数、构造函数、析构函数,它都有优先级的。

这里不多说了,可以上网搜搜,也可以在每个函数内部加句代码调试看看。

记住:不是每个人都能把知识讲的非常全面,中间有时也要养成自己动手的能力,多听,多看,多敲,多多总结,努力吧!

C++第四课:类的使用(二)[个人见解]的更多相关文章

  1. 智课雅思词汇---二十四、形容词后缀-al-ial-ar-ary-ic-id-ish-ile-ine-oid-ory

    智课雅思词汇---二十四.形容词后缀-al-ial-ar-ary-ic-id-ish-ile-ine-oid-ory 一.总结 一句话总结: 1.形容词后缀-al? autumnal 英 [ɔː'tʌ ...

  2. 智课雅思词汇---二十四、名词性后缀ary(也是形容词后缀)

    智课雅思词汇---二十四.名词性后缀ary(也是形容词后缀) 一.总结 一句话总结:很多词缀即是名词词缀也是形容词词缀,很多词即是名词也是形容词 1.名词性后缀-tude? 词根词缀:-tude [来 ...

  3. NeHe OpenGL教程 第四十四课:3D光晕

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. 【C语言探险】 第四课的第二部分:串

    内容简单介绍 1.课程大纲 2.第二部分第四课: 字符串 3.第二部分第五课预告: 预处理 课程大纲 我们的课程分为四大部分,每个部分结束后都会有练习题,并会发布答案.还会带大家用C语言编写三个游戏. ...

  5. 【Web探索之旅】第二部分第四课:数据库

    内容简介 1.第二部分第四课:数据库 2.第二部分第五课预告:响应式网站 第二部分第四课:数据库 说到“数据库”,顾名思义,是“数据的仓库”的意思. 所以数据库的一大作用就是储存数据咯. 为什么Web ...

  6. 【C语言探索之旅】 第二部分第四课:字符串

    内容简介 1.课程大纲 2.第二部分第四课: 字符串 3.第二部分第五课预告: 预处理 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. ...

  7. [Effective Java]第四章 类和接口

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. 【Linux探索之旅】第二部分第四课:文件操纵,鼓掌之中

    内容简介 1.第二部分第四课:文件操纵,鼓掌之中 2.第二部分第五课预告:用户和权限 文件操纵,鼓掌之中 既然上一课我们学习了Linux中的文件组织方式,那么现在就该是玩弄,啊不,是操纵它们的时候了. ...

  9. 【Linux探索之旅】第一部分第四课:磁盘分区,并完成Ubuntu安装

    内容简介 1.第一部分第四课:磁盘分区,并完成Ubuntu安装 2.第一部分第五课预告:Unity桌面,人生若只如初见 磁盘分区 上一课我们正式开始安装Ubuntu了,但是到了分区的那一步,小编却戛然 ...

随机推荐

  1. Spring ElasticsearchTemplate 经纬度按距离排序

    es实体,用 @GeoPointField 注解,值为:中间逗号隔开,如 29.477000,119.278536(经度, 维度) @Document(indexName = "v_inte ...

  2. Groovy闭包详解

    Groovy闭包是一种可执行代码块的方法,闭包也是对象,可以向方法一样传递参数,因为闭包也是对象,因此可以在需要的时候执行,像方法一样闭包可以传递一个或多个参数.闭包最常见的用途就是处理集合,可以遍历 ...

  3. 转载:C++中堆和栈的区别

    C++中堆和栈的区别,自由存储区.全局/静态存储区和常量存储区     文章来自一个论坛里的回帖,哪个论坛记不得了!    在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和 ...

  4. Linux-Shell编程之求命令行中所有整数之和

    前言 复习shell编程知识,书中有此练习题,之前学习时便没有搞透彻,此次是非啃下不可. 但是,摸索许久,却屡碰南墙,于是查阅网络博客,结果有让人比学不懂知识更让生气的是:博文遍地,净是抄袭!连个截图 ...

  5. Git首次配置

    用户身份配置 安装好Git后的第一步是设置用户名和电子邮件地址.这一步是很重要的,因为以后这将作为你每一次提交的个人信息,写入所创建的提交中,不可更改. git config --global use ...

  6. 用SQL表达连接与外连接

    关系代数运算中,有连接运算,又分为θ连接和外连接 标准SQL语言中连接运算通常是采用 SELECT 列名[[,列名]...] FROM 表名1,表名2,... WHERE 检索条件; SQL的高级语法 ...

  7. .call() 与 .apply() 的用法及区别

    首先说明两个方法的含义: apply:调用一个对象的一个方法,用另一个对象替换当前对象.例如:B.apply(A, arguments);即A对象应用B对象的方法.call:调用一个对象的一个方法,用 ...

  8. 四, 判断语句; 循环; 使用dict和set

    1)  练习 小明身高1.75,体重80.5kg.请根据BMI公式(体重除以身高的平方)帮小明计算他的BMI指数,并根据BMI指数: 低于18.5:过轻 18.5-25:正常 25-28:过重 28- ...

  9. poj1847 Tram(最短路dijkstra)

    描述: Tram network in Zagreb consists of a number of intersections and rails connecting some of them. ...

  10. TP5多模块开发

    一般的thinkphp框架一般都是单模块开发的,但有时候我们可能需要进行多模块开发,例如添加个后台管理的模块.这次给人讲课,在Tp多模块开发的配置上翻车,感觉很有必要总结下,话不多说,直接上干货. 总 ...