在C++里,通过继承和组合实现了代码复用,使得开发效率提高,并且能够通过代码看到事物的关系

组合比继承简单,所以在写代码时先考虑能否组合,再来考虑继承.


组合的特点

  • 其它类的对象作为当前类的成员使用

比如主机类,拥有 CPU/主板/内存/硬盘这4个对象成员,而这4个对象成员并没有继承主机类的特性和行为

继承的特点

  • 新的类(子类)具有旧的类(父类)的属性和行为
  • 旧的类被称为父类,也叫基类
  • 新的类被称为子类,也叫派生类(一个派生类也可以继承多个基类)
  • 子类可以添加新的属性和行为(成员变量和成员函数),也可以重写已有的属性和行为
  • 一个子类只继承一个父类,便被称为单继承
  • 一个子类若继承多个父类,便被称为多继承
  • 子类其实就是一个特殊的父类,比如:苹果手机是手机,就是将苹果手机当做一个特殊的父类对待

子类对象可以初始化父类对象,也可以赋值给父类对象,比如:

class Parent
{
int mValue;
public:
Parent()
{
mValue=;
}
int Value()
{
return mValue;
}
}; class Child : public Parent
{
public:
Child()
{
cout<<"I'm child"<<endl;
}
}; int main()
{
Child c;
cout<< c.Value() <<endl; //调用父类的成员函数 Parent p1 =c;    //通过子类初始化父类 Parent p2; p2=c; //通过子类复制给父类
}

类的访问级别之protected

大家都知道,类里private修饰的成员和函数,不能被外界直接访问.

虽然子类拥有父类的属性和行为,但是在子类里,也不能访问父类的private私有成员

比如:

class Parent
{
int mValue;
public:
Parent(int i=)
{
mValue=i;
}
int Value()
{
return mValue;
}
}; class Child : public Parent
{
public:
Child()
{
cout<<mValue<<endl; //在子类中,访问父类的private成员,将会编译报错
}
};

所以类的访问级别引入了新的关键字protected

protected的特性

  • 修饰的成员不能被外界直接访问
  • 修饰的成员可以被子类(包括子类的子类)直接访问, 也可以在本类内部直接访问

有了protected的加入,定义类时,我们就需要仔细考虑成员的访问级别,如下图所示:

接下来做个综合实例,组合与继承

  • 需要一个父类Object, 为子类Point子类Line 提供name名字和info信息
  • 由于线Line至少需要两个点Point才能组成,所以Line子类内部需要通过Point子类来组合

如下图所示:

开始写代码:

#include <iostream>
#include <string>
#include <sstream> using namespace std; class Object
{
protected:
string mName;
string mInfo;
public:
Object()
{
mName="Object";
mInfo="";
}
string name()
{
return mName;
}
string info()
{
return mInfo;
}
}; class Point : public Object
{
protected:
int x; //坐标
int y; public:
Point(int x=,int y=)
{
ostringstream s;
this->x =x;
this->y =y;
s<<"P("<<x<<","<<y<<")"; //坐标信息
mName="Point";
mInfo=s.str();
}
}; class Line : public Object
{
private:
Point mP1;
Point mP2;
public:
Line(Point p1,Point p2)
{
ostringstream s;
mP1 =p1;
mP2 =p2;
s<<"Line from " <<p1.info() <<" to "<<p2.info(); //线的信息
mName ="Line";
mInfo =s.str();
}
}; int main()
{
Point p1(,);
Point p2(,);
Line L(p1,p2);
/*打印点的信息*/
cout<<p1.name()<<":"<<endl;
cout<<p1.info()<<endl; /*打印线的信息*/
cout<<L.name()<<":"<<endl;
cout<<L.info()<<endl;
return ;
}

运行打印:

Point:
P(,) Line:
Line from P(,) to P(,)

接下来来学习: 23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、虚函数

22.C++- 继承与组合,protected访问级别的更多相关文章

  1. C++中继承的protected访问级别

    1,子类是否可以直接访问父类的私有成员? 2,根据面向对象理论: 根据 C++ 语法: 3,继承中的访问级别编程实验: #include <iostream> #include <s ...

  2. Java继承与组合

    Java继承与组合 继承 java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承. 子类继承父类的成员变量 子类能够继承父类 ...

  3. [Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类

    目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式 ...

  4. Java中的继承与组合

    本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到 ...

  5. Python面向对象的三大特性之继承和组合

    继承和组合 一.组合 组合:组合指的是,在一个类中以另外一个类的对象(也就是实例)作为数据属性,称为类的组合 也就是说:一个类的属性是另一个类的对象,就是组合 例子: 圆环是由两个圆组成的,圆环的面积 ...

  6. 关于Java中的继承和组合的一个错误使用的例子

    [TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...

  7. java 中继承,组合,重载,重写的实现原理 (转)

    我们知道,继承,组合,重载,重写是java语言的面向对象实现的基本特征. 那么在java内部,究竟是如何实现这些面对对象的基本特征的呢? 继承和组合是面向对象中代码复用的主要实现方式,他们可以达到类似 ...

  8. <Java中的继承和组合之间的联系和区别>

    //Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...

  9. Java中的继承与组合(转载)

    本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到 ...

随机推荐

  1. [POJ2115]C Looooops 拓展欧几里得

    原题入口 这个题要找到本身的模型就行了 a+c*x=b(mod 2k) ->  c*x+2k*y=b-a 求这个方程对于x,y有没有整数解. 这个只要学过拓展欧几里得(好像有的叫扩展欧几里德QA ...

  2. NTT中可用素数模数原根表

    常用素数: P = 1004535809 ====> pr = 3 P = 998244353 =====> pr = 3 //(g 是mod(r*2^k+1)的原根) 素数 r k g ...

  3. 1.3 java与C++有什么异同

    相同点: 都是面向对象的语言,都使用了面向对象的思想(封装,继承,多态等),可重用性 不同点: 1.java没有指针,避免了指针可能引起的系统问题. 2.java不支持多重继承,C++可以.但java ...

  4. (3)Deep Learning之神经网络和反向传播算法

    往期回顾 在上一篇文章中,我们已经掌握了机器学习的基本套路,对模型.目标函数.优化算法这些概念有了一定程度的理解,而且已经会训练单个的感知器或者线性单元了.在这篇文章中,我们将把这些单独的单元按照一定 ...

  5. java 压缩文件

    package folder; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundExcept ...

  6. struct 2 基本知识

    (最近在写一个ssh的项目,虽然看网上好像都说ssh已经过气了...之前虽然老师有上过这个课,我还做了一个PPT专门讲这个来着,但果然没有实践经验还是不容易理解.在参照一个项目写ssh时候,表示四脸蒙 ...

  7. 关于word2016中mathtype无法使用以及“由于宏安全设置,无法找到宏或宏已被禁用”的解决方案

    版本描述: 系统:win10 64位 word: 2016版 32位 Mathtype: 6.9d (6.9b也出现相同问题,应该可以通过相同的方法解决) 问题描述: 自从在一次win10更新之后,w ...

  8. Openstack Pycharm 的远程调试

    问题背景 最近再研究openstack cinder api的时候遇到了个问题:使用命令行调用API的时候,使用domain的token时,会产生一个错误,但是通过cinder的api都无法确定产生错 ...

  9. python实现一般最小二乘系统辨识方法

    问题: 对于一个未知参数的系统,往往需要用到系统辨识的方法,例如对于一个单输入单输出系统: Z(k)+a1*Z(k-1)+a2*Z(k-2)=b1*U(k-1)+b2*U(k-2)+V(k) 其中:V ...

  10. Unity3D 心跳检测

    在B/S结构的项目开发的过程当中 在服务端与客户端正常的通信之外 服务端通常还需要知道客户端是否还处于连接状态 或者客户端也需要知道服务端是否还处在开启状态 大白话说完了,听一下比较正统的解释吧(摘自 ...