22.C++- 继承与组合,protected访问级别

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

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


组合的特点

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

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

继承的特点

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

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

class Parent
{
       int mValue;
public:    
       Parent()
       {
              mValue=10;
       }  
       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=0)
       {
              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=0,int y=0)
       {
              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(2,3); 
       Point p2(6,3);
       Line  L(p1,p2);

       /*打印点的信息*/
       cout<<p1.name()<<":"<<endl;
       cout<<p1.info()<<endl;

       /*打印线的信息*/
       cout<<L.name()<<":"<<endl;
       cout<<L.info()<<endl;
       return 0;
}

运行打印:

Point:
P(2,3)

Line:
Line from P(2,3) to P(6,3)

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏吴伟祥

logback高级特性使用 原

logback支持类似于占位符的变量替换功能,即如果输出的msg里面带有{}符号且括号中间不带其他字符,那么logback在构造LoggingEvent的时候,...

702
来自专栏Zephery

2017-03-03学习笔记

一、String StringBuffer.toString()源码: @Override public synchronized String toStrin...

35711
来自专栏智能算法

Python学习(五)---- 不可不知的装饰器!

https://blog.csdn.net/fgf00/article/details/52061971

672
来自专栏ShaoYL

IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解

2999
来自专栏xingoo, 一个梦想做发明家的程序员

关键字explicit

关键字只能用在类构造函数。它的作用是不能进行隐式转换。 1 class gxgExplicit //没有关键字explicit的类 2 3 { 4 ...

2146
来自专栏性能与架构

JS执行顺序

javascript给人的直观感受是,从上往下执行,但实际上却不是这样的,先看个例子 1. console.log(test); 2. var test = ...

4086
来自专栏進无尽的文章

基础篇-ObjectC继承、类别、属性

    在实际的开发过程中,继承和类别都会得到很多用处。对于界面相似度很高的情况下,使用继承可以节省很多代码和设置,只需要在子类中重写父类中的方法,或者增加新的...

801
来自专栏前端小吉米

JS 完美的 AOP 编程

1614
来自专栏闪电gogogo的专栏

Python——正则表达式

此篇文章结合小甲鱼的笔记和视频整理。 1 编译 Python 通过 re 模块为正则表达式引擎提供一个接口,同时允许你将正则表达式编译成模式对象,并用它们来进行...

28710
来自专栏用户2442861的专栏

JAVA反射机制作用是什么

Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框架技术有很大的帮助。

1.4K2

扫码关注云+社区

领取腾讯云代金券