发布日期:2015-12-29 09:48 来源: 标签: 编程语言 C++教程 C++类继承 C++基类和派生类
本章我们主要学习C++单继承中的基类与派生类,下面我们就做一下具体讲解,希望大家多多支持中国站长网络学院。
C++中单继承有着很广阔的运用,一般软件开发中通过继承现有功能类的方式设计出功能更强大的处理类。但是通常要求基类中封装一类事物中最普遍的属性与操作,供派生类继承并加入新的属性与操作进行扩展。下面依然通过水果类继承实例,加入操作方法与数据成员,了解继承体系中基类与派生类的使用。
1.准备实例
打开UE工具,创建新的空文件并且另存为chapter1002_01.h、chapter1002_01.cpp、chapter1002_02.h、chapter1002_02.cpp与testMain.cpp。该代码文件随后会同makefile文件一起通过FTP工具传输至Linux服务器端,客户端通过scrt工具访问操作。程序代码文件编辑如下所示。
/**
* 实例chapter1002
* 源文件chapter1002_01.hchapter1002_01.cpp
* chapter1002_02.h chapter1002_02.cpp testMain.cpp
* 水果类单继承方式
*/
//水果基类头文件chapter1002_01.h
#ifndef FRUIT_H
#define FRUIT_H
#include <iostream>
#include <string>
using namespace std;
class Fruit                                                                                              //水果类Fruit
{
         public:
                   Fruit();                                                                        //水果类构造函数
                   ~Fruit();                                                                      //水果类析构函数
                   voidsetFruitName(const char* name);               //水果类设置水果名称方法成员
                   voidshowFruitInfo();                                                        //水果类打印输出水果信息方法成员
                   voideatFruit();                                                          //水果类吃水果方法成员
         protected:
                   charm_name[100];                                                //水果类私有保护数据成员,表示水果名称
};
#endif
//水果基类源文件chapter1002_01.cpp
#include "chapter1002_01.h"
Fruit::Fruit()                                                                                  //水果类构造函数定义实现
{
         cout<<"Fruitclass construction!"<<endl;                      //打印输出构造函数信息
}
Fruit::~Fruit()                                                                                //水果类析构函数
{
         cout<<"Fruitclass destruction!"<<endl;                        //打印输出析构函数信息
}
void Fruit::setFruitName(const char* name)                         //设置水果类名称信息方法定义实现
{
         strcpy(m_name,name);                                                   //通过拷贝的方式将传入的参数赋值到数据成员中
}
void Fruit::showFruitInfo()                                                         //打印输出水果类信息方法定义实现
{
         cout<<"showFruit member m_name:"<<m_name<<endl;        //打印输出水果类名称成员
}
void Fruit::eatFruit()                                                                    //水果类吃水果方法成员定义实现
{
         cout<<"eatFruit!"<<endl;                                                 //打印输出水果类吃水果方法实现信息
}
//苹果类头文件chapter1002_02.h
#include "chapter1002_01.h"
class Apple: public Fruit                                                            //苹果类Apple,公开继承至水果基类Fruit
{
         public:
                   Apple();                                                                      //苹果类构造函数
                   ~Apple();                                                                   //苹果类析构函数
                   voidsetAppleName(const char* name);            //苹果类设置名称方法成员
                   voidshowAppleInfo();                                            //苹果类打印苹果信息方法成员
                   voideatFruit();                                                          //苹果类中吃水果方法成员
};
//苹果类源文件chapter1002_02.cpp
#include "chapter1002_02.h"
Apple::Apple()                                                                             //苹果类构造函数定义实现
{
     cout<<"Appleclass construction!"<<endl;
}
Apple::~Apple()                                                                                    //苹果类析构函数定义实现
{
         cout<<"Appleclass destruction!"<<endl;
}
void Apple::setAppleName(const char* name)                   //苹果类设置名称方法定义实现
{
         strcpy(m_name,name);
}
void Apple::showAppleInfo()                                                   //苹果类打印输出苹果信息方法成员定义实现
{
         cout<<"showApple member m_name"<<m_name<<endl;
}
void Apple::eatFruit()                                                                           //苹果类中吃苹果方法成员定义实现
{
         cout<<"eatApple!"<<endl;
}
//主程序源文件testMain.cpp
#include "chapter1002_02.h"
/*主函数入口*/
int main()
{
         Fruitfruit;                                                                            //定义水果类对象fruit
         fruit.setFruitName("Fruit");                                                     //水果类对象fruit调用其设置名称方法
         fruit.showFruitInfo();                                                         //水果类对象fruit调用其打印水果信息方法
         fruit.eatFruit();                                                                    //水果类对象fruit调用其吃水果方法
         Appleapple;                                                                      //定义苹果类对象apple
         apple.setAppleName("Apple");                                               //苹果类对象apple调用其设置名称方法
         apple.showAppleInfo();                                                   //苹果类对象apple调用其打印苹果信息方法
         apple.eatFruit();                                                                 //苹果类对象apple调用其吃水果方法
}
本实例程序主要通过水果、苹果类演示单类继承方式。程序主要由主函数与水果、苹果类组成,相关类中除了相应的构造与析构后,还包含相应输出数据成员信息的方法。程序具体分析见程序注释与后面的讲解。
2.编辑makefile
Linux平台下需要编译源文件为chapter1002_01.cpp、chapter1002_02.cpp、testMain.cpp,相关makefile工程文件编译命令编辑如下所示。
OBJECTS=chapter1002_01.o chapter1002_02.otestMain.o
CC=g++
testMain: $(OBJECTS)
         $(CC)$(OBJECTS) -o testMain
testMain.o:
chapter1002_01.o: chapter1002_01.h
chapter1002_02.o: chapter1002_02.h
clean:
      rm-f testMain core $(OBJECTS)
submit:
       cp-f -r testMain ../bin
       cp-f -r *.h ../include
上述makefile文件套用前面的模板格式,主要替换了代码文件、程序编译中间文件、可执行程序等。在编译命令部分-g选项的加入,表明程序编译同时加入了可调式信息。
3.编译运行程序
当前shell下执行make命令,生成可执行程序文件。随后通过make submit命令提交程序文件至本实例bin目录,通过cd命令定位至实例bin目录,执行该程序文件运行结果如下所示。
[billing@localhost src]$ make
g++    -c -ochapter1002_01.o chapter1002_01.cpp
g++    -c -ochapter1002_02.o chapter1002_02.cpp
g++    -c -otestMain.o testMain.cpp
g++ chapter1002_01.o chapter1002_02.o testMain.o-o testMain
[billing@localhost src]$ make submit
cp -f -r testMain ../bin
cp -f -r *.h ../include
[billing@localhost src]$ cd ../bin
[billing@localhost bin]$ ./testMain
Fruit class construction!
show Fruit member m_name:Fruit
eat Fruit!
Fruit class construction!
Apple class construction!
show Apple member m_nameApple
eat Apple!
Apple class destruction!
Fruit class destruction!
Fruit class destruction!
4.程序剖析
本实例主要演示水果继承体系中单继承的基本实现。主要由两个类源文件组成包含水果基类以及其派生出的苹果类。苹果类采用public方式继承至基类水果类,其中基类中包含构造与析构函数、设置水果类名称方法、打印水果类信息方法以及吃水果动作方法接口的定义。派生出的苹果类除了拥有基类成员外根据需要添加了自身类的构造与析构函数、设置苹果类名称方法、打印苹果类信息方法以及吃水果动作方法接口定义。
实例主程序源文件中,首先定义基类Fruit对象fruit。此时会调用其自定义构造函数构造对应的对象实例。构造函数中主要实现一条提示信息语句。随后通过该对象实例调用其方法成员setFruitName,根据传入的实参设置水果基类的保护数据成员。采用fruit对象调用showFruitInfo打印输出设置的水果基类的数据成员m_name。最后通过fruit对象调用其吃水果动作方法,该方法主要实现为打印执行该方法的提示信息。
主程序中之后定义派生类苹果类对象实例apple,派生类由于继承基类所有成员。所以初始化构造派生类对象之前需要首先调用基类水果类的构造函数,即程序运行结果中首先会打印输出基类构造函数调用的提示信息。随后才调用派生苹果类构造信息。通过apple对象调用其setAppleName方法设置继承至基类水果类的保护数据成员,随后调用showAppleInfo方法打印输出该成员信息。最后则通过apple对象调用eatFruit方法打印输出属于吃苹果具体的信息提示。
从上述实例中总结出单继承的一些特点。首先,单继承中基类对象定义操作与派生类无关,完全可以将基类作为一个单独的类来处理应用。其次派生类中通过public方式继承,包含了基类的所有的成员,其中保护数据成员m_name在派生类中拥有一份拷贝可以供其对象使用。另外派生类中对象实例构造时构造函数执行需要优先执行基类构造,同时对象实例退出时析构函数的调用顺序则正好相反。
最后,派生类中允许定义与基类同样名称的方法成员。此时派生类对象调用同名称方法时,基类该方法成员将会被隐藏。

相关评论

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