第八章总结:继承

本文详细介绍了C++中的继承机制,包括单继承和多继承的基本概念、构造与析构过程、成员访问规则以及派生类的初始化过程。通过具体实例展示了如何在派生类中实现对基类成员的重写和扩展。


第八章:继承总结

  • 基础知识

一、类之间的关系

1.继承:在已有类的基础上创建新类的过程

一个 B 类继承A类,或称从类 A 派生类 B

    A 称为基类(父类),类 B 称为派生类(子类)

二、基类和派生类

类继承关系的语法形式

    class派生类名 : 基类名表

    {

          数据成员和成员函数声明

    };

基类名表 构成

    访问控制  基类名1, 访问控制  基类名2, 访问控制  基类名n

访问控制 表示派生类对基类的继承方式,使用关键字:

   public     公有继承

    private       私有继承

   protected  保护继承

()、访问控制

不论种方式继承基类,派生类都不能直接使用基类的私有成员

()、派生类的生产过程

派生类的生成过程经历了三个步骤:

      ●吸收基类成员(全部吸收(构造、析构除外),但不一定可见)

      ●改造基类成员

      ●添加派生类新成员

1、吸收基类成员

●在C++的继承机制中,派生类吸收基类中除构造函数和析构函数之外的全部成员。

2、改造基类成员

通过在派生类中定义同名成员(包括成员函数和数据成员)来屏蔽(隐藏)在派生类中不起作用的部分基类成员。

3、增加新成员

  仅仅继承基类的成员是不够的,需要在派生类中添加新成员,以保证派生类自身特殊属性和行为的。

()、重名成员

派生类定义了与基类同名的成员,在派生类中访问同名成员时屏蔽(hide)了基类的同名成员

在派生类中使用基类的同名成员,显式地使用类名限定符:类名 :: 成员

()、派生类中访问静态成员

    基类定义的静态成员,将被所有派生类共享(基类和派生类共享基类中的静态成员)

 根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质

 派生类中访问静态成员,用以下形式显式说明:

           类名 :: 成员

或通过对象访问   对象名 . 成员

三、基类初始化

在创建派生类对象时用指定参数调用基类的构造函数来初始化派生类继承基类的数据

 派生类构造函数声明为

派生类构造函数 ( 变元表 ): 基类 ( 变元表 ) , 对象成员1( 变元表 )

        … 对象成员n ( 变元表 )

 构造函数执行顺序:基类对象成员派生类

派生类构造函数和析构函数的定义规则

派生类构造函数和析构函数的使用原则

基类的构造函数和析构函数不能被继承 如果基类没有定义构造函数或有无参的构造函数, 派生类也可以不用定义构造函数 如果基类无无参的构造函数,派生类必须定义构造函数 如果派生类的基类也是派生类,则每个派生类只负责直接基类的构造 派生类是否定义析构函数与所属的基类无关

派生类的构造函数的定义

●派生类的数据成员既包括基类的数据成员,也包括派生类新增数据成员。

C++,派生类构造函数的一般格式为:

      派生类::派生类名(参数总表):基类名(参数表)

     {

             // 派生类新增成员的初始化语句

     }

     注意:这是基类有构造函数且含有参数时使用

派生类析构函数

1)当派生类中不含对象成员时

●在创建派生类对象时,构造函数的执行顺序是:基类的构造函数派生类的构造函数;

●在撤消派生类对象时,析构函数的执行顺序是:派生类的析构函数基类的析构函数。

2)当派生类中含有对象成员时

●在定义派生类对象时,构造函数的执行顺序:基类的构造函数→对象成员的构造函数→派生类的构造函数;

●在撤消派生类对象时,析构函数的执行顺序:派生类的析构函数→对象成员的析构函数→基类的析构函数。

四、多继承

一个类有多个直接基类的继承关系称为多继承

 多继承声明语法

class 派生类名 : 访问控制 基类名1 ,  访问控制  基类名2,  … , 访问控制  基类名n

   {

        数据成员和成员函数声明

}

()、多继承的派生类构造和访问

多个基类的派生类构造函数可以用初始式调用基类构造函数初始化数据成员。

执行顺序与单继承构造函数情况类似。多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序。

 一个派生类对象拥有多个直接或间接基类的成员。不同名成员访问不会出现二义性。如果不同的基类有同名成员,派生类对象访问时应该加以识别。

多继承方式下构造函数的执行顺序:

●先执行所有基类的构造函数

●再执行对象成员的构造函数

●最后执行派生类的构造函数

处于同一层次的各基类构造函数的执行顺序取决于定义派生类时所指定的基类顺序

与派生类构造函数中所定义的成员初始化列表顺序没有关系。

内嵌对象成员的构造函数执行顺序与对象在派生类中声明的顺序一致

多继承的析构函数

●析构函数名同样与类名相同,无返回值、无参数,而且其定义方式与基类中的析构函数的定义方式完全相同。

●功能是在派生类中对新增的有关成员进行必要的清理工作。

●析构函数的执行顺序与多继承方式下构造函数的执行顺序完全相反,首先对派生类新增的数据成员进行清理,再对派生类对象成员进行清理,最后才对基类继承来的成员进行清理。  

赋值兼容原则:

●赋值兼容规则指在程序中需要使用基类对象的任何地方,都可以用公有派生类的对象来替代。

赋值兼容规则中所指的替代包括以下的情况:

  a 派生类的对象可以赋给基类对象

  b 派生类的对象可以初始化基类的引用

  c 派生类的对象的地址可以赋给基类类型的指针

赋值兼容的可行性

通过公有继承,

派生类得到了除了构造、析构函数以外的所有成员

且这些成员的访问控制属性也和基类完全相同。

这样,它便具备了基类的所有功能。

 利用赋值兼容规则

a 派生类的对象可以赋给基类对象(强制类型转换)

b 派生类的对象可以初始化基类的引用

c 派生类的对象的地址可以赋给基类类型的指针

赋值兼容原则的特点:

●在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。

  • 例题总结

1.class Point

{  friend ostream &operator<< (ostream &, const Point &);

 public:

   Point( int = 0, int = 0 ) ; // 带默认参数的构造函数

   void setPoint( int, int ) ; // 对点坐标数据赋值

   int getX() const { return x ; }        int getY() const { return y ; }

 protected:    int x, y;   // Point类的数据成员

};

class Circle : public Point

{  friend ostream &operator<< (ostream &, const Circle&); // 友元函数

 public:

   Circle(double r=0.0, int x=0, int y=0);   //构造函数

   void setRadius(double);  /*置半径*/          double getRadius() const;     /*返回半径*/

   double area() const;    // 返回面积

 protected:    double radius;  // 数据成员,半径

};

2. // Point 类的成员函数

 

// 构造函数,调用成员函数对 xy作初始化

Point::Point ( int a, int b )

   { setPoint ( a , b ) ; }

// 对数据成员置值

void Point :: setPoint ( int a, int b)  { x = a ;  y = b ; }

// 重载插入算符,输出对象数据

ostream &operator<< ( ostream&output , const Point &p )

{ output << '[' << p.x<< "," << p.y << "]"  ;

    return output ;

}

3. // Circle 类的成员函数

// 带初始化式构造函数,首先调用基类构造函数

Circle::Circle( double r, int a, int b): Point( a, b )  { setRadius ( r ); }

// 对半径置值

void Circle::setRadius ( double r)  { radius = ( r >= 0 ? r : 0 ); }

// 返回半径值

double Circle::getRadius() const {return  radius; }

// 计算并返回面积值

double Circle::area() const  { return 3.14159 * radius * radius ; }

// 输出圆心坐标和半径值

ostream & operator<< (ostream &output, const Circle &c)

{ output << "Center = "<< '[' << c.x << "," << c.y <<"]" << "; Radius = "

              << setiosflags(ios::fixed|ios::showpoint)<< setprecision(2) << c.radius ;

  return  output ;

}

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
内容概要:本文系统阐述了企业新闻发稿在生成式引擎优化(GEO)时代下的全渠道策略与效果评估体系,涵盖当前企业传播面临的预算、资源、内容与效果评估四大挑战,并深入分析2025年新闻发稿行业五大趋势,包括AI驱动的智能化转型、精准化传播、首发内容价值提升、内容资产化及数据可视化。文章重点解析央媒、地方官媒、综合门户和自媒体四类媒体资源的特性、传播优势与发稿策略,提出基于内容适配性、时间节奏、话题设计的策略制定方法,并构建涵盖品牌价值、销售转化与GEO优化的多维评估框架。此外,结合“传声港”工具实操指南,提供AI智能投放、效果监测、自媒体管理与舆情应对的全流程解决方案,并针对科技、消费、B2B、区域品牌四大行业推出定制化发稿方案。; 适合人群:企业市场/公关负责人、品牌传播管理者、数字营销从业者及中小企业决策者,具备一定媒体传播经验并希望提升发稿效率与ROI的专业人士。; 使用场景及目标:①制定科学的新闻发稿策略,实现从“流量思维”向“价值思维”转型;②构建央媒定调、门户扩散、自媒体互动的立体化传播矩阵;③利用AI工具实现精准投放与GEO优化,提升品牌在AI搜索中的权威性与可见性;④通过数据驱动评估体系量化品牌影响力与销售转化效果。; 阅读建议:建议结合文中提供的实操清单、案例分析与工具指南进行系统学习,重点关注媒体适配性策略与GEO评估指标,在实际发稿中分阶段试点“AI+全渠道”组合策略,并定期复盘优化,以实现品牌传播的长期复利效应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值