发布日期:2015-12-29 09:34 来源: 标签: 编程语言 C++教程 C++类 C++类继承
C++中类作为一种自定义类型的数据结构,在面向对象程序设计思想中有着相当重要的作用。类代表一类事物的集合,与现实社会相似,类类型同样具有继承实现的可能。现实社会中事物的继承性随处可见,如父子的继承关系等。下面我们就做一下具体讲解,希望大家多多支持中国站长网络学院。
      C++中类作为一种自定义类型的数据结构,在面向对象程序设计思想中有着相当重要的作用。类代表一类事物的集合,与现实社会相似,类类型同样具有继承实现的可能。现实社会中事物的继承性随处可见,如父子的继承关系等。
      C++软件开发中,继承机制有着很多的运用。通常在软件编程中,继承与多态性的结合运用可以增加软件的扩展性以及应用程序可重用性。C++语言中将继承分为三种情况,即public、protected以及private继承。不同的继承方式有着不同的限制规则,这点会在后续的继承层次结构中详细讲述。
      通常,C++编程中的继承采用public方式居多,不排除特殊情况下会使用另外两种继承方式。但是protected与private继承方式的使用复杂性可能造成不必要的出错。下面主要通过类public继承方式来讲述类继承的基本概念与实际应用。首先通过一个完整的public继承方式的实例直观的了解继承的实现。
1.准备实例
打开UE工具,创建新的空文件并且另存为chapter1001_01.h、chapter1001_01.cpp、chapter1001_02.h、chapter1001_02.cpp。该代码文件随后会同makefile文件一起通过FTP工具传输至Linux服务器端,客户端通过scrt工具访问操作。程序代码文件编辑如下所示。
/**
* 实例chapter1001
* 源文件chapter1001_01.h chapter1001_01.cpp
* chapter1001_02.h chapter1001_02.cpp
* 水果类单继承方式
*/
//水果类头文件chapter1001_01.h
#include <iostream>
using namespace std;
class Fruit                                                                           //水果类Fruit定义
{
         public:                                                               //水果类公开接口成员
                   Fruit(){}                                                    //水果类构造函数定义
                   ~Fruit(){}                                                  //水果类析构函数定义
                   voidshowFruitInfo();                                      //水果类信息打印函数
};
//水果类源文件chapter1001_01.cpp
#include "chapter1001_01.h"
void Fruit::showFruitInfo()                                      //水果类信息打印方法外部定义
{
         cout<<"Thisis Fruit class!"<<endl;
}
//苹果类头文件,chapter1001_02.h继承至水果类
#include "chapter1001_01.h"
class Apple: public Fruit                                         //苹果类Apple定义,以public方式继承至Fruit类
{
         public:                                                               //苹果类公开接口成员
                   Apple(){}                                                 //苹果类构造函数定义
                   ~Apple(){}                                                        //苹果类析构函数定义
                   voidshowAppleInfo();                          //苹果类信息显示函数
};
//苹果类源文件chapter1001_02.cpp
#include "chapter1001_02.h"
void Apple::showAppleInfo()                                 //苹果类信息显示函数外部定义
{
         cout<<"Thisis Apple class!"<<endl;
}
int main()
{
         Fruitfruit;                                                          //主程序中定义水果类对象fruit
         Appleapple;                                                    //定义苹果类对象apple
         fruit.showFruitInfo();                                      //使用水果类对象调用其打印信息方法
         apple.showFruitInfo();                                   //使用苹果类对象调用继承至水果类方法成员打印类信息
         apple.showAppleInfo();                                //使用苹果类对象调用自身方法成员打印类信息
         return0;
}
本实例主要通过水果类、苹果类演示类单继承方式应用情况。程序主要由4个文件组成,分别为水果类头文件、源文件以及具体苹果类头文件、源文件。具体程序剖析见程序注释与后面讲解。
2.编辑makefile
Linux平台下需要编译源文件为chapter1001_01.cpp、chapter1001_02.cpp,相关makefile工程文件编译命令编辑如下所示。
#makefile
OBJECTS= chapter1001_01.o chapter1001_02.o
CC=g++
#生成可执行程序Apple
Apple: $(OBJECTS)
         $(CC)$(OBJECTS) -o Apple
chapter1001_01.o: chapter1001_01.h
chapter1001_02.o: chapter1001_02.h
#清除源文件以外的操作命令
clean:
        rm-f Apple core $(OBJECTS)
submit:
         cp-f -r Apple ../bin
         cp-f -r *.h ../include
上述makefile文件的编写是Linux系统下工程化的编译思想的体现。由于Linux系统下编译器采用的是命令执行形式,makefile文件的组织应用,有利于大型软件工程中代码的编译管理。
以上make命令是执行makefile文件中编译命令。为了使makefile编译文件显得更加的灵活可扩展,此处在makefile文件中增加变量定义,将makefile中多处重复使用的部分提取出来,采用变量定义来表示。这样下次需要增加或者修改对应的文件只需要修改一次即可。上述文件中,主要将程序生成的.o工程文件定义为变量OBJECTS表示,将编译器g++定义为变量CC表示。为此下次需要增加文件或者换用编译命令只需要修改该变量定义即可。
随后将变量运用到执行命令中,此处,采用另一种形式来定义代码文件编译命令。直接通过代码工程文件以及对应的头文件,让make命令自动去推导程序应该执行的编译命令。此处主要涉及两个工程文件的编译,即chapter1001_01.o和chapter1001_02.o,与其对应的代码文件分别为chapter1001_01.h、chapter1001_01.cpp、chapter1001_02.h以及chapter1001_02.cpp,主程序入口定义于chapter1001_02.cpp中。最后,为了清除当前目录下生成的程序以及出错产生的core等垃圾文件定义了clean选项,选项下执行rm –f,表示指定清楚随后的各种文件。
上述实例中不仅采用工程化makefile文件编译方式,同时也采用多代码文件的方式来编写实例程序。本实例共涉及四个代码文件,两个头文件代码,以及两个对应的代码源文件。在软件编程中,代码文件划分应用也是大型软件工程中必不可少的部分,头文件与源代码文件的区分会让软件组织结构更加的合理。
3.编译运行程序
当前shell下执行make命令,生成可执行程序文件。随后通过make submit命令提交程序文件至本实例bin目录,通过cd命令定位至实例bin目录,执行该程序文件运行结果如下所示。
[developer @localhost src]$ make
g++ -c -o chapter1001_01.o chapter1001_01.cpp
g++ -c -o chapter1001_02.o chapter1001_02.cpp
g++ chapter1001_01.o chapter1001_02.o  -o Apple
[developer @localhost src]$ make submit
cp -f -r Apple ../bin
cp -f -r *.h ../include
[developer @localhost src]$ cd ../bin
[developer @localhost bin]$ ./Apple
This is Fruit class!
This is Fruit class!
This is Apple class!
通常在C++面向对象的应用开发中,应用程序的头文件主要包含类体的定义,以及程序需要使用的常量定义等。而源文件则主要是类方法成员的具体实现的场所。使用时只需要#include包含对应的头文件即可。
4.程序剖析
多文件的使用更多的优势之处会在后续更多实例中慢慢体现出来,这里只作简单的介绍。本实例中主要涉及两个类,即水果类Fruit和苹果类Apple。两个类之间为继承关系,由于水果类代表一类广泛的概念类型,而苹果类则代表了具体水果的一种类型,它们之间存在一定的关联。这种关联可以理解为继承关联,即苹果类是从水果类继承而来的。
实例中四个代码文件,其中chapter1001_01.h与chapter1001_01.cpp为水果类定义文件。头文件chapter1001_01.h中包含类Fruit的定义,该类包含自定义空的构造函数与析构函数,以及一个打印自身信息的方法成员showFruitInfo(),暂不包括任何数据成员。chapter1001_01.cpp文件中主要定义实现类Fruit的方法成员,只包含chapter1001_01.h头文件,此处主要定义实现类方法成员showFruitInfo()。
头文件chapter1001_02.h中定义Apple类,采用公开继承方式从水果类派生定义而开。此时需要包含水果类头文件chapter1001_01.h,因为此处需要使用到该类的声明定义。该文件中Apple类公开继承至水果类Fruit,即意味着Apple类拥有了基类的所有成员,同时在此基础上Apple中还定义了显示本信息的方法成员,该成员在chapter1001_02.cpp源文件中定义实现。
主程序中首先定义基类对象fruit,此时必然调用其定义构造函数构造该类对象实例。随后定义其派生类对象apple,该对象拥有基类一切成员的同时还拥有自定义的成员。程序中首先对Fruit对象实例构造完毕后,调用其信息显示函数showFruitInfo(),打印本类基本信息。随后使用苹果类对象实例分别调用自Fruit类继承的该方法,以及该类本身的信息显示方法。

相关评论

专题信息
    C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。最新正式标准C++于2014年8月18日公布。 其编程领域众广,常用于系统开发,引擎开发等应用领域,是至今为止最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性! 本教程从基础讲解了C++语言,希望对大家有所帮助,望多多支持中国站长网络学院。