继承

继承时从新的类从已有类那里得到新的特征。继承实现了代码的重用,极大地减少了代码量,同时通过新增成员,加入了自身的独有特性,达到了程序的扩充。

派生类继承了基类的全部数据类和除了构造函数、析构函数以外的全部函数成员,但是这些成员的访问属性造派生的过程中是可以调整的。从基类继承的成员的访问属性是根据继承的改变而改变,不同的继承方式的访问限制是不同的。

继承方式有公有继承(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++ 第四次作业 继承的更多相关文章

  1. C++第四次作业--继承与派生

    C++ 继承 面向对象程序设计中最重要的一个概念是继承.继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易.这样做,也达到了重用代码功能和提高执行效率的效果. 当创建一个类时 ...

  2. Java第四次作业——面向对象高级特性(继承和多态)

    Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...

  3. Java第四次作业,面向对象高级特性(继承和多态)

    Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...

  4. Java第四次作业—面向对象高级特性(继承和多态)

    Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...

  5. C#基础第四天-作业答案-Hashtable-list<KeyValuePair>泛型实现名片

    .Hashtable 实现 Hashtable table = new Hashtable(); while (true) { Console.WriteLine("------------ ...

  6. C#基础第四天-作业-Hashtable-list<KeyValuePair>泛型实现名片

    1.名片集: 名片集实现功能:不限定集合实现 增加,查询,查询全部,删除 功能,需求条件: 根据姓名去(查询/删除)某一行数据.指定:姓名,年龄,性别,爱好,联系方式. 采用技术:Hashtable- ...

  7. 【西北师大-2108Java】第四次作业成绩汇总

    [西北师大-2108Java]第四次作业成绩汇总 深入理解程序设计中算法与程序的关系: 深入理解java程序设计中类与对象的关系: 理解OO程序设计的第2个特征:继承.多态: 学会采用继承定义类设计程 ...

  8. 【OO学习】OO第四单元作业总结及OO课程总结

    [OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...

  9. BUAA OO 2019 第四单元作业总结

    目录 第四单元总结 总 UML UML 类图 UML 时序图 UML 状态图 架构设计 第十三次作业 第十四次作业 课程总结 历次作业总结 架构设计 面向对象方法理解 测试方法理解与实践 改进建议 尽 ...

随机推荐

  1. 模板与泛型编程 c++ primer ch16.1

    在摸板定义中,模板参数列表不能为空, 编译器用推断出的参数来进行 实例化(instantiation) 一般来说 模板是有type parameter 但是也可以声明 nontype paramete ...

  2. LINUX普通猫的拔号工具介绍

    普通猫分为串口和PCI的,请查看 <关于网络设备概述 > 普通猫的拔号工具主要有kppp和wvdial:在Redhat/Fedora中,用system-config-network 或re ...

  3. sar-CPU统计数据

    sar -u输出显示CPU信息.-u选项是sar的默认选项.该输出以百分比显示CPU的使用情况.表3-2解释该输出. 表3-2                                      ...

  4. redis范围查询应用 数据库 数据库学习 Redis redis范围查询的方法

    redis范围查询应用. 需求 根据IP找到对应的城市 原来的解决方案 oracle表(ip_country): 查询IP对应的城市: 1.把a.b.c.d这样格式的IP转为一个数字,例如为把210. ...

  5. bzoj 1026 [SCOI2009]windy数——数位dp水题

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026 迷恋上用dfs写数位dp了. #include<iostream> #in ...

  6. 批处理启动应用程序(win)

    @echo off net session >nul 2>&1 " ( echo Oops: This tools must run with administrator ...

  7. ACdream 1099求第k大

    题目链接 瑶瑶的第K大 Time Limit: 10000/5000MS (Java/Others)Memory Limit: 512000/256000KB (Java/Others) Submit ...

  8. Session学习小结

    前言: 1.我们在学习一项技术的时候,首先应该是什么时候会用到这项技术.这次学习session也是如此,一般的web项目中都有用户的存在,有用户那么就有了用户的管理,而用户往往是存在于session中 ...

  9. 对List<Map<String, Object>>集合排序

    private void mySort(List<Map<String, Object>> list) { //list为待排序的集合,按SEQ字段排序 Comparator& ...

  10. ajax下载小于500M大文件【原】

    不推荐使用的FileReader 之前用FileReader读取下载文件,当文件超过1M浏览器就立即扑街了 // 文件下载 function download(blob, fileName) { va ...