发布日期:2015-12-29 09:53 来源: 标签: 编程语言 C++教程 C++类继承 C++中public
public继承中,派生类继承至基类,即拥有基类的所有成员基础上增加属于派生类的成员。此时针对派生类的访问控制增加了基类成员部分。public继承方式下,基类的public成员在派生类中依然保持public属性,即派生类中可以保持对public成员的访问权限。派生类对象可以在类体外直接访问基类以及派生类本身的公开成员,包括非静态方法成员、友元函数以及数据成员。
      类采用public方式从基类派生,基类中的public与protected成员在派生类中依然保持public与protected成员访问规则。类继承体系中,基类本身的访问控制方式与单独类访问控制无异,即可以将基类本身看成单独存在的类去应用,因为继承应用其中一个重要的原因就是基类可能被其它程序使用。为了保留基类对象的完整性,通过对基类的继承,来定义新的类类型供使用。这样在保持原有应用程序不变的情况下可以扩充和丰富具体继承类的操作。所以,基类在继承体系中依然保持独立的访问控制。
      public继承中,派生类继承至基类,即拥有基类的所有成员基础上增加属于派生类的成员。此时针对派生类的访问控制增加了基类成员部分。public继承方式下,基类的public成员在派生类中依然保持public属性,即派生类中可以保持对public成员的访问权限。派生类对象可以在类体外直接访问基类以及派生类本身的公开成员,包括非静态方法成员、友元函数以及数据成员。
      而public继承方式下基类的protected成员在派生类中依然保持protected成员访问控制规则,即派生类中只有非静态方法成员以及友元可以直接访问。public继承方式下,基类的private成员在派生类中依然保持private成员特性,派生类中不允许访问基类的private成员。但是可以通过基类public或者protected成员来访问,为此保证基类的隐藏特性。下面通过一个完整实例演示公开继承访问控制方式。
1.准备实例
打开UE工具,创建新的空文件并且另存为chapter1003_01.h、chapter1003_01.cpp、chapter1003_02.h、chapter1003_02.cpp。该代码文件随后会同makefile文件一起通过FTP工具传输至Linux服务器端,客户端通过scrt工具访问操作。程序代码文件编辑如下所示。
/**
* 实例chapter1003
* 源文件chapter1003_01.hchapter1003_01.cpp
* chapter1003_02.h chapter1003_02.cpp
* 水果类公开继承访问控制
*/
//水果类头文件chapter1003_01.h
#ifndef      FRUIT_H
#define     FRUIT_H
#include <iostream>
#include <string>
using namespace std;
class Fruit                                                                                    //水果类Fruit定义
{
         public:                                                                        //水果类公开方法成员
                   Fruit(){}                                                             //水果类构造函数定义
                   ~Fruit(){}                                                           //水果类析构函数定义
                   voidsetFruitId(int id);                                     //水果类设置水果编号方法成员
                   voidshowFruitId();                                         //水果类打印水果编号方法成员
         public:                                                                        //水果类公开数据成员
                   stringm_name;                                                       //字符串数据成员表示水果名称
         protected:                                                                  //水果类保护类型数据成员
                   intm_price;                                                     //整型数据成员表示水果价格
         private:                                                                       //水果类私有保护数据成员
                   intm_id;                                                           //整型数据成员表示水果编号
};
#endif
//水果类源文件chapter1003_01.cpp
#include "chapter1003_01.h"
void Fruit::setFruitId(int id)                                                        //水果类公开设置水果编号函数定义,传入整型参数表示编号
{
         m_id= id;
}
void Fruit::showFruitId()                                                   //水果类公开打印水果编号函数定义
{
         cout<<"TheFruit id:"<<m_id<<endl;
}
//苹果类头文件chapter1003_02.h
#ifndef APPLE_H
#define APPLW_H
#include "chapter1003_01.h"
class Apple: public Fruit                                                  //公开继承至水果类的苹果类定义
{
         public:                                                                        //苹果类公开方法成员
                   Apple(){}                                                           //苹果类构造函数
                   ~Apple(){}                                                                  //苹果类构函数
                   voidsetApplePrice(int price);                       //苹果类设置苹果价格方法成员
                   voidshowApplePrice();                                 //苹果类打印苹果价格的方法成员
};
#endif
//苹果类源文件chapter1003_02.cpp
#include "chapter1003_02.h"
void Apple::showApplePrice()                                        //苹果类打印苹果价格方法成员定义
{
         cout<<"Thisis Apple price:"<<m_price<<endl;
}
void Apple::setApplePrice(int price)                              //苹果类设置苹果价格方法成员定义,传入整型参数表示价格
{
         m_price= price;
}
int main()
{
         Appleapple;                                                             //定义苹果类对象apple
         apple.m_name= "apple";                                               //对象apple访问继承至基类的公开数据成员m_name
         cout<<apple.m_name<<endl;                              //通过对象apple直接打印类公开成员m_name
         apple.setApplePrice(3);                                         //apple对象调用设置苹果价格方法
         apple.showApplePrice();                                       //apple对象调用打印苹果价格方法
         apple.setFruitId(1);                                                  //apple对象调用设置水果编号方法
         apple.showFruitId();                                                //apple对象调用打印水果编号方法
         return0;
}
本实例通过水果类单继承方式演示类继承中公共继承访问控制情况。程序由主函数与水果、苹果类组成。具体程序剖析见程序注释与后面的讲解。
2.编辑makefile
Linux平台下其makefile编译文件中涉及两个头文件以及两个源代码文件,makefile文件编辑如下。
OBJECTS= chapter1003_01.o chapter1003_02.o
CC=g++
Apple: $(OBJECTS)
       $(CC)$(OBJECTS) -o Apple
chapter1003_01.o: chapter1003_01.h
chapter1003_02.o: chapter1003_0.h
clean:
       rm-f Apple core $(OBJECTS)
上述makefile文件套用前面的模板格式,主要替换了代码文件、程序编译中间文件、可执行程序等。在编译命令部分-g选项的加入,表明程序编译同时加入了可调式信息。
3.编译运行程序
当前shell下执行make命令,生成可执行程序文件,随后通过make submit命令提交程序文件至本实例bin目录,通过cd命令定位至实例bin目录,执行该程序文件运行结果如下所示。
[developer @localhost src]$ make
g++    -c -ochapter1003_01.o chapter1003_01.cpp
g++    -c -ochapter1003_02.o chapter1003_02.cpp
g++ chapter1003_01.o chapter1003_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
apple
This is Apple price:3
The Fruit id:1
4.程序剖析
      上述实例依然采用水果继承实例作为演示。基类水果类中定义三类不同权限控制成员,分别是公开接口成员,以及公开数据成员、保护数据成员与私有数据成员。实例目的是验证在其派生类Apple类中访问基类成员的控制规则。Fruit基类中公开接口分别为setFruitId()与showFruitId()两个方法成员。该方法成员主要访问其私有保护数据成员,设置以及打印该该保护成员表示的水果编号。
      派生而来的Apple类中除了继承至Fruit类所有成员之外,同时添加属于Apple类的方法成员setApplePrice()与showApplePrice()。分别用来在Apple类中设置、打印继承到的保护数据成员m_price。主函数中首先定义Apple类对象。由于公有继承原先基类的公开成员,在派生类中非静态函数、友元以及派生类外部函数中可以直接使用,所以随后直接采用Apple类对象实例调用其继承基类的数据成员m_name并直接赋值,最后打印输出。
       Apple对象实例apple调用设置苹果价格的方法成员。根据传入的实参来设置继承至基类保护类型数据成员,由于公开继承中保护成员在派生类中依然保持保护成员的访问控制特性。所以在派生类中自然可以通过其public类型方法成员操作。Apple对象实例调用完价格成员设置之后,调用其价格打印方法成员在屏幕上打印显示价格信息。
      由于public类型继承方式,私有的成员在派生类中都不可以直接操作。所以只能通过继承至基类的公开接口来操作其私有保护成员。上述实例中Apple类对象实例调用继承至Fruit类的公开方法成员setFruitId以及showFruitId方法,分别设置该基类私有数据成员编号值以及屏幕打印该值。

相关评论

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