继承

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

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

继承方式有公有继承(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. 2019-3-1-win10-uwp-发布旁加载自动更新

    title author date CreateTime categories win10 uwp 发布旁加载自动更新 lindexi 2019-03-01 09:40:27 +0800 2019-0 ...

  2. js对象属性方法大总结

    数组(Array):系列元素的有序集合: 详细演示请看:[js入门系列演示·数组 ] http://www.cnblogs.com/thcjp/archive/2006/08/04/467761.ht ...

  3. eclipse中部署web项目

    因为eclipse是免费的,所以很多企业都会选用eclipse作为开发工作,那么我们就需要熟练使用eclipse部署web项目. 第一步:选择window -> preferences ,选择s ...

  4. 【每日一linux命令7】用户及用户组

    一.查询用户及用户组相关命令 1.whoami 查询当前登录的用户名 2.groups 查询当前登录用户名所在的用户组 3.groups root 查询root用户名所在的用户组 二.怎么批量查看用户 ...

  5. linux下对拍

    #!/bin/bash t=0; while true; do let "t = $t + 1" printf $t printf ":\n" ./rand & ...

  6. caffe 的docker安装过程及相关linux操作总结

    一.caffe 和 docker的安装编译 docker pull caffe镜像(注意使用docker安装省去安装CUDA和cudnn的安装.) 安装相关依赖包 安装opencv3(使用源码安装) ...

  7. Hdu 1299

    Diophantus of Alexandria Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  8. 深入剖析Redis RDN持久化机制

    rdb是redis保存内存数据到磁盘数据的其中一种方式(另一种是AOF).Rdb的主要原理就是在某个时间点把内存中的所有数据的快照保存一份到磁盘上.在条件达到时通过fork一个子进程把内存中的数据写到 ...

  9. Linux安装MariaDB(Mysql)和简单配置 mariadb

    Linux安装MariaDB(Mysql)和简单配置 1.安装MariaDB 安装命令 yum -y install mariadb mariadb-server 安装完成MariaDB,首先启动Ma ...

  10. Java.控制层.响应工具类.

    Java.控制层.响应工具类. package cn.com.spdbccc.cds.index.web.base; public class ApiResponse { private int co ...