/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称:理解基类中成员的访问限定符和派生类的继承方式。
* 作 者: 雷恒鑫
* 完成日期: 2012 年 04月 28 日
* 版 本 号: V1.0
* 对任务及求解方法的描述部分
* 输入描述:由下面派生类Student1对基类Student的继承……
* 问题描述:(1)请修改基类中成员的访问限定符和派生类的继承方式,考虑可能的运行结果或可能出现的错误,并在上机时进行验证、对比,达到 理解派生类成员的访问属性的目的。
* 程序输出:总结(1)的结果,将(1)的结果摘要写到报告中;最后用自己的话总结确定派生类成员的访问属性的原则,也写到报告中。
* 程序头部的注释结束
*/
以下是源程序代码:
#include<iostream>
#include<string>
using namespace std;
class Student //(1)修改student类中各数据成员和成员函数的访问限定符,并观察发生的现象
{
public:
Student(int n,string nam,char s) ;
void show();
~Student( ){ }
protected:
int num;
string name;
char sex ;
};
class Student1: public Student //(2)修改此处的继承方式,并观察发生的现象
{
public:
Student1(int n,string nam,char s,int a,string ad);
void show1( );
~Student1( ){ }
private:
int age;
string addr;
};
Student::Student(int n,string nam,char s)
{
num=n;
name=nam;
sex=s;
}
void Student::show()
{
cout<<"num: "<<num<<endl;
cout<<"name: "<<name<<endl;
cout<<"sex: "<<sex<<endl<<endl;
}
Student1::Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s)
{
age=a;
addr=ad;
}
void Student1::show1( )
{
cout<<"num: "<<num<<endl;
cout<<"name: "<<name<<endl;
cout<<"sex: "<<sex<<endl;
cout<<"age: "<<age<<endl;
cout<<"address: "<<addr<<endl<<endl;
}
int main( )
{
Student1 stud1(10010,"Wang-li",'f',19,"115 Beijing Road,Shanghai");
Student1 stud2(10011,"Zhang-fun",'m',21,"213 Shanghai Road,Beijing");
Student stud3(20010,"He-xin",'m');
stud1.show1( );
stud2.show( );
stud3.show( );
return 0;
}
运行结果:
改动一:
如果把class Student1:
public Student中的public 改为private,则编译器提示错误为:'show' : cannot access public member
declared in class 'Student'!
说明Student类里的成员函数void
show();变成了私有的,不允许Student类外的对象访问。
改动二:
如果把class Student1:publicStudent中的public改为protected,则编译器提示错误为:'show'
: cannot access public member declared in class 'Student'!
说明Student类里的成员函数voidshow();变成了受保护类型的,不允许Student类的对象直接访问。
改动三:
当我把Student中的public改为protected,编译器会出现3个错误,第一个为'Student::Student'
: cannot access protected member declared in class 'Student'! 第二个为:'Student::~Student' : cannot access protected member declared in class 'Student'! 第三个为:'show' : cannot access protected member declared in class 'Student'!
说明受保护成员函数不能够被对象直接调用!
改动四:
当我把Student中的public改为private,编译器会出现4个错误,第一个为'Student::~Student'
: cannot access private member declared in class 'Student'! 第二个为:'Student::Student' : cannot access private member declared in class 'Student'! 第三个为:'show'
: cannot access private member declared in class 'Student'!
说明私有成员函数和受保护成员函数一样,都不能被对象直接调用!
总结:
1.派生类中访问属性为公用的成员在派生类内部和外部都可以访问。
2.派生类中访问属性为受保护的成员在派生类内部可以访问,在派生类外部不可以访问。
3.派生类中访问属性为私有的成员在派生类内部可以访问,在派生类外部不可以访问。
分享到:
相关推荐
1.1 简介--------------------------------------------------------------1 1.2 什么是计算机------------------------------------------------------3 1.3 计算机组成-------------------------------------...
保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。 这种继承方式与私有继承方式的情况相同。两者的区别仅在于对派生...
一、填空题(25 小题,共50 分) ...3.在基类和派生类中,派生类可以定义其基类中不具备的数据和操作。对两个有相同 名字的数据成员进行访问时,如果没有作用域分隔符限定时,对此数据成员的访问将出现 歧义。
9.6 在派生类中重定义基类成员 9.7 Public、Protected和Private继承 9.8 直接基类和间接基类 9.9 在派生类中使用构造函数和析构函数 9.10 将派生类对象隐式转换为基类对象 9.11 关于继承的软件工程 9.12 复合...
15.2 定义基类和派生类 473 15.2.1 定义基类 474 15.2.2 protected成员 475 15.2.3 派生类 476 15.2.4 virtual与其他成员函数 479 15.2.5 公用、私有和受保护的继承 482 15.2.6 友元关系与继承 486 15.2.7 继承与...
如果某个派生类的部分或者全部直接基类是从另一个共同的基类派生而来,在这些俄直接基类中, 从上一级基类继承来的成员就拥有相同的名称,因此派生类中就会出现同名现象。对这种类型的同名成员也要使用作用域分辨符...
9.6 在派生类中重定义基类成员 9.7 Public、Protected和Private继承 9.8 直接基类和间接基类 9.9 在派生类中使用构造函数和析构函数 9.10 将派生类对象隐式转换为基类对象 9.11 关于继承的软件工程 9.12 复合...
15.2 定义基类和派生类 527 15.2.1 定义基类 528 15.2.2 定义派生类 529 15.2.3 类型转换与继承 534 15.3 虚函数 536 15.4 抽象基类 540 15.5 访问控制与继承 542 15.6 继承中的类作用域 547 15.7...
14.2.1 派生类中的赋值操作符和复制 构造函数 426 14.2.2 派生类的析构函数 426 14.2.3 保护继承和私有继承 436 14.2.4 多继承 437 第15章 多态与虚函数 442 15.1 虚函数基础 442 15.1.1 后绑定 442 15.1.2 ...
15.2 定义基类和派生类 527 15.2.1 定义基类 528 15.2.2 定义派生类 529 15.2.3 类型转换与继承 534 15.3 虚函数 536 15.4 抽象基类 540 15.5 访问控制与继承 542 15.6 继承中的类作用域 547 15.7...
第12章 继承 12.1 什么是继承和派生 12.1.1 复杂的继承和派生 12.1.2 继承和派生如何在C++中实现 12.1.3 继承的种类及语法 12.1.4 单一继承 12.2 公有型、保护型和私有型 12.3 访问权限 12.4 多重继承 12.5 继承的...
第12章 继承 12.1 什么是继承和派生 12.1.1 复杂的继承和派生 12.1.2 继承和派生如何在C++中实现 12.1.3 继承的种类及语法 12.1.4 单一继承 12.2 公有型、保护型和私有型 12.3 访问权限 12.4 多重继承 12.5...
第12章 类和对象 12.1 类 12.2 结构和类是相互关联的 12.3 联合和类是相互关联的 12.4 友元函数 12.5 友元类 12.6 内联函数 12.7 在类中定义内联函数 12.8 带参数的构造函数 12.9 带一个参数的构造函数:特例 12.10 ...
7.3.3 派生类直接访问基类成员——base 122 7.3.4 继承中的构造函数 123 7.4 多态 124 7.5 抽象 128 7.5.1 抽象类、抽象方法的声明 129 7.5.2 抽象类的使用 129 7.5.3 抽象方法的使用 130 7.6 密封 132 7.6.1 密封类...
12.概述.NET里对 remoting 和 webservice 两项技术的理解和实际中的应用。 远程逻辑调用,remoing接口只能用在.net中 13.什么是code-behind技术 aspx and cs 14.概述三层结构体系 web/business/dataaccess 15.asp...
但它是一个抽象的基类,Type有与每种数据类型对应的派生类,我们使用这个派生类的对象的方法、字段、属性来查找有关该类型的所有信息。 获取给定类型的Type引用有3种常用方式: ●使用 C# typeof 运算符。 Type t...
第一章导论 1 1.1 从图形处理到通用并行计算 1 1.2 CUDATM:一种通用并行计算架构 3 1.3 一种可扩展的编程模型 3 1.4 文档结构 4 第二章编程模型 7 2.1 内核 7 2.2 线程层次 8 2.3 存储器层次 11 2.4 异构编程 11 ...