发布日期:2015-12-29 09:57 来源: 标签: 编程语言 C++教程 C++类继承 C++中protected
当派生类采用protected方式继承至基类时,基类中的public与protected成员在派生类中都自动转变为protected成员。即此时只能通过派生类的非静态成员函数以及其友元函数可直接访问。而基类的私有保护成员在派生类中则被隐藏,只能通过调用基类的公开成员以及保护成员来访问。
      当派生类采用protected方式继承至基类时,基类中的public与protected成员在派生类中都自动转变为protected成员。即此时只能通过派生类的非静态成员函数以及其友元函数可直接访问。而基类的私有保护成员在派生类中则被隐藏,只能通过调用基类的公开成员以及保护成员来访问。
为了演示上述继承方式下成员访问控制,则上一小节实例可修改为protected继承方式。
1.准备实例
      打开UE工具,创建新的空文件并且另存为chapter1004_01.h、chapter1004_01.cpp、chapter1004_02.h、chapter1004_02.cpp。该代码文件随后会同makefile文件一起通过FTP工具传输至Linux服务器端,客户端通过scrt工具访问操作。程序代码文件编辑如下所示。
//水果类Fruit.h
#ifndef FRUIT_H
#define FRUIT_H
#include <iostream>
#include <string>
using namespace std;
class Fruit
{
           public:
                  Fruit(){}
                  ~Fruit(){}
                  void setFruitId(int id);
                  void setFruitName(string name);
                  void showFruitId();
                  void showFruitName();
           public:
                  string m_name;
           protected:
                  int m_price;
           private:
                  int m_id;
};
#endif
//水果类源文件Fruit.cpp
#include "Fruit.h"
void Fruit::setFruitId(int id)
{
           m_id = id;
}
void Fruit::setFruitName(string name)
{
           m_name = name;
}
void Fruit::showFruitId()
{
           cout<<"The Fruitid:"<<m_id<<endl;
}
void Fruit::showFruitName()
{
           cout<<"The Fruitname:"<<m_name<<endl;
}
//苹果类头文件Apple.h
#ifndef APPLE_H
#define APPLW_H
#include "Fruit.h"
class Apple: protected Fruit
{
           public:
                 Apple(){}
                 ~Apple(){}
                 void setAppleInfo(int id,string name,intprice);
                 void showAppleInfo();
};
#endif
//苹果类源文件Apple.cpp
#include "Apple.h"
void Apple::showAppleInfo()
{
           showFruitId();
           showFruitName();
           cout<<"This is Appleprice:"<<m_price<<endl;
}
void Apple::setAppleInfo(int id,string name,intprice)
{
           m_price = price;
           setFruitId(id);
           setFruitName(name);
}
int main()
{
           Apple apple;
           apple.setAppleInfo(1,"Apple",3);
           apple.showAppleInfo();
           return 0;
}
本实例通过水果类单继承方式演示类继承中保护继承访问控制情况。程序由主函数与水果、苹果类组成。具体程序剖析见程序注释与后面的讲解。
2.编辑makefile
Linux平台下其makefile编译文件中涉及两个头文件以及两个源代码文件,makefile文件编辑如下。
OBJECTS=chapter1004_01.o chapter1004_02.o
CC=g++
Apple: $(OBJECTS)
       $(CC)$(OBJECTS) -o Apple
chapter1004_01.o: chapter1004_01.h
chapter1004_02.o: chapter1004_02.h
clean:
        rm-f Apple core $(OBJECTS)
submit:
        cp-f -r Apple ../bin
        cp-f -r *.h ../include
上述makefile文件套用前面的模板格式,主要替换了代码文件、程序编译中间文件、可执行程序等。在编译命令部分-g选项的加入,表明程序编译同时加入了可调式信息。
3.编译运行程序
当前shell下执行make命令,生成可执行程序文件,随后通过make submit命令提交程序文件至本实例bin目录,通过cd命令定位至实例bin目录,执行该程序文件运行结果如下所示。
[billing@localhost src]$ make
g++    -c -ochapter1004_01.o chapter1004_01.cpp
g++    -c -ochapter1004_02.o chapter1004_02.cpp
g++ chapter1004_01.o chapter1004_02.o -o Apple
[billing@localhost src]$ make submit
cp -f -r Apple ../bin
cp -f -r *.h ../include
[billing@localhost src]$ cd ../bin
[billing@localhost bin]$ ./Apple
The Fruit id:1
The Fruit name:Apple
This is Apple price:3
      本实例程序中,采用protected继承方式。由于基类中public与protected成员在派生类中统一演变为protected成员,所以基类中定义的setFruitId、setFruitName、showFruitId、与showFruitName方法成员在派生类中只能通过派生类自定义方法成员访问。所以派生类中增加setAppleInfo与showAppleInfo方法用于调用基类中相关公开接口成员,便于外界通过派生类对象间接调用。
      与上述实例不同的是,主程序中,基类public类型的数据成员m_name在派生类中已经变为protected成员,不能在派生类外部函数中直接访问。同时,基类公开的public成员也不能在派生类外部通过对象实例直接调用,而只能通过派生成员间接访问其基类公开成员。另外,基类中的私有数据成员也只能通过基类public与protected成员访问,protected继承方式实际上增加了了继承类中成员的访问控制力度。

相关评论

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