C++ 第四次作业 继承
继承
继承时从新的类从已有类那里得到新的特征。继承实现了代码的重用,极大地减少了代码量,同时通过新增成员,加入了自身的独有特性,达到了程序的扩充。
派生类继承了基类的全部数据类和除了构造函数、析构函数以外的全部函数成员,但是这些成员的访问属性造派生的过程中是可以调整的。从基类继承的成员的访问属性是根据继承的改变而改变,不同的继承方式的访问限制是不同的。
继承方式有公有继承(public)、保护继承(protect)、私有继承(private)三种。
公有继承
当继承方式为共有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可直接访问。可以理解为,在共有继承中,派生类中也具有了基类的公有成员和保护成员,派生类的其他成员可以直接访问,但是基类的私有成员无法访问,只能通过基类的其它成员间接获取。
#include "pch.h"
#include <iostream>
using namespace std; class Point // 基类的定义
{
public:
Point()
{
}
void initP(float xx, float yy)
{
x = xx;
y = yy;
} float GetX()
{
return x; }
float GetY()
{
return y;
}
private:
float x;
float y;
}; class Rectangle : public Point // 公有继承
{
public:
void initR(float x, float y, float w, float h)
{
initP (x , y); // 可以访问到基类的公有和保护成员
W = w; // 无法直接对基类私有成员的赋值,只能间接赋值
H = h;
}
float GetH()
{
return H;
} float GetW()
{
return W;
} private: // 对派生类进行私有数据成员的添加
float W;
float H;
}; int main()
{ // 简单测试
Rectangle a;
a.initR(, , , );
cout << a.GetX() << a.GetY() << a.GetW() << a.GetH() << endl;
a.GetX(); // 通过派生类对象访问基类的成员函数
}
私有继承
当类的继承方式为私有继承时,基类中的公有成员和保护成员都以私有成员的身份出现在派生类中,而基类的私有成员在派生类不可直接访问。派生类的其他成员可以访问基类的公有和保护成员,但是在类外无法通过派生类的对象访问他们。而对于基类的私有成员,派生类的成员无法直接访问。
class Rectangle : private Point // 私有继承
{
public:
void initR(float x, float y, float w, float h)
{
initP (x , y); // 可以访问到基类的公有和保护成员
W = w;
H = h;
}
float GetH()
{
return H;
}
float GetW()
{
return W;
}
private:
float W;
float H;
};
但是与共有继承不同的是,私有继承无法通过派生类的对象对基类的公有、保护成员进行访问了,当然,私有成员肯定也无法进行访问。

对基类公有成员进行访问,编译器出现语法错误提示。
保护继承
在保护继承中,基类的公有成员和保护成员都以保护成员的身份出现在基类中,而基类的私有成员不可直接访问。
在直接派生类中,其访问限制与私有继承的效果是相似的,在派生类内部可以访问基类的公有、保护保护成员,而用过派生类的对象无法访问到基类的成员。但是,一旦出现了连续继承,保护继承和私有继承的效果就会出现明显不同。以两次保护继承和两次私有继承为例:
#include "pch.h"
#include <iostream>
using namespace std; class Point
{
public:
Point()
{ }
void initP(float xx, float yy)
{
x = xx;
y = yy;
} float GetX()
{
return x; }
float GetY()
{
return y;
}
private:
float x;
float y;
}; class Rectangle : protected Point // 保护继承
{
public:
void initR(float x, float y, float w, float h)
{
initP (x , y);
W = w;
H = h;
}
float GetH()
{
return H;
} float GetW()
{
return W;
}
private:
float W;
float H;
}; class AA : protected Rectangle // 再次利用 保护继承
{
public:
AA(float x, float y, float w, float h){
initR( x, y, w, h);
}
void printf()
{
cout << GetX() <<" 和 "<< GetY(); //此时仍然可以访问到Point的公有函数
}
private:
}; int main()
{ // 简单测试
AA a(, , , );
a.printf();
}

在这里,Point类中的公有、保护成员在第一次继承中成为了Rec类中的保护成员,在第二次继承中,同样地以AA类中保护成员的身份存在,所以AA中的成员函数可以访问到。但不用的是,在两次私有继承后,AA中成员函数无法输出结果,因为两次继承中Point类中的成员都以私有成员的身在存在,派生类的对象或者成员都无法访问到。
C++ 第四次作业 继承的更多相关文章
- C++第四次作业--继承与派生
C++ 继承 面向对象程序设计中最重要的一个概念是继承.继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易.这样做,也达到了重用代码功能和提高执行效率的效果. 当创建一个类时 ...
- Java第四次作业——面向对象高级特性(继承和多态)
Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...
- Java第四次作业,面向对象高级特性(继承和多态)
Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...
- Java第四次作业—面向对象高级特性(继承和多态)
Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...
- C#基础第四天-作业答案-Hashtable-list<KeyValuePair>泛型实现名片
.Hashtable 实现 Hashtable table = new Hashtable(); while (true) { Console.WriteLine("------------ ...
- C#基础第四天-作业-Hashtable-list<KeyValuePair>泛型实现名片
1.名片集: 名片集实现功能:不限定集合实现 增加,查询,查询全部,删除 功能,需求条件: 根据姓名去(查询/删除)某一行数据.指定:姓名,年龄,性别,爱好,联系方式. 采用技术:Hashtable- ...
- 【西北师大-2108Java】第四次作业成绩汇总
[西北师大-2108Java]第四次作业成绩汇总 深入理解程序设计中算法与程序的关系: 深入理解java程序设计中类与对象的关系: 理解OO程序设计的第2个特征:继承.多态: 学会采用继承定义类设计程 ...
- 【OO学习】OO第四单元作业总结及OO课程总结
[OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...
- BUAA OO 2019 第四单元作业总结
目录 第四单元总结 总 UML UML 类图 UML 时序图 UML 状态图 架构设计 第十三次作业 第十四次作业 课程总结 历次作业总结 架构设计 面向对象方法理解 测试方法理解与实践 改进建议 尽 ...
随机推荐
- 哈哈哈哈,我竟然发现了个MSDN里面的笔误
typedef __PROCESSOR_INFO { WORD wVersion; WCHAR szProcessorCore[40]; WORD wCoreRevision; WCHAR ...
- Codevs1922 骑士共存问题
1922 骑士共存问题 题目描述 Description 在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入. 对于给定的n*n个方格的国 ...
- Leetcode63.Unique Paths II不同路径2
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为" ...
- curl应用大法
curl -s -S -k --max-redirs 5 -m 60 --connect-timeout 60 -w "\n\n%{time_namelookup}|%{time_conn ...
- bzoj 1024 [SCOI2009]生日快乐——模拟
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1024 可以枚举这边放多少块.那边放多少块. 注意精度.不要每次用x*y/base算有多少块, ...
- 洛谷 3398 仓鼠找sugar——树链剖分
题目:https://www.luogu.org/problemnew/show/P3398 原来只要把值记录成第几次就行了. 别忘了while(top[a]!=top[b])之后还要走一步. #in ...
- map.(parseInt)方法详解
偶然间碰到这样一个问题: ["1","2", "3"].map(parseInt) //[ 1, NaN, NaN ] 运行结果 [ 1, ...
- arcgis 点线面操作
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 洛谷 P2955 [USACO09OCT]奇数偶数Even? Odd?【字符串/易错】
题目描述 Bessie's cruel second grade teacher has assigned a list of N (1 <= N <= 100) positive int ...
- ie8或9下ajax跨域问题
ie8或9下ajax跨域支持,添加如下代码 <!--[if (IE 8)|(IE 9)]><script src="https://cdn.bootcss.com/jque ...