C++11之继承构造函数(using 声明)

系列文章

C++11之正则表达式(regex_match、regex_search、regex_replace)

C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)

C++11之智能指针(unique_ptr、shared_ptr、weak_ptr、auto_ptr)浅谈内存管理

C++11之强制类型转换(static_cast,const_cast,dynamic_cast,reinterpret_cast)

C++11之Lanbda表达式(匿名函数)

C++11之右值引用:移动语义和完美转发(带你了解移动构造函数、纯右值、将亡值、右值引用、std::move、forward等新概念)


文章目录

  • 系列文章
  • 场景
    • 继承类的创建释放顺序
  • 通过using关键字继承
    • 继承成员函数
    • 继承构造函数
    • 带有默认参数的构造函数
    • 继承构造函数导致的“冲突”
  • 继承构造函数的优缺点
    • 优点
    • 缺点


场景

首先我们来看下面这段代码,有一个Class A、还有一个继承于A的Class B,Class B仅仅增加了一个虚函数,但是就需要把Class A的所有构造方法进行“补齐”。

class A
{
public:A(int i){}A(double d, int i){}A(float f, int i, const char* c){}
};class B : public A
{
public:B(int i):A(i) {}B(double d, int i):A(d, i) {}B(float f, int i, const char* c):A(f, i, c) {}virtual void test(){}
};

继承类的创建释放顺序

就以上面A为父类,B为子类为例,当创建一个B类的对象时,先调用父类的构造函数,然后调用自身的构造函数,在进行释放时,先调用自身的析构函数,然后在调用父类的析构函数。(注: 如果有读者不太了解可以在子类和父类中的构造、析构函数中进行日志输出观察。这块不是重点就一笔带过。)

通过using关键字继承

那么对于上述这个例子中,如果子类B在构造函数中不调用父类A对应的构造函数的话,编译器就会自动调用父类A的默认构造函数,结果A没有默认构造函数就会报错。
在这里插入图片描述
所以为了解决父类中有好多的构造函数,而导致出现这种繁琐的步骤,在C++11中就引入了,子类可以通过using关键字,通过声明继承父类构造函数。

继承成员函数

这里定义了一个父类Base,并有一个参数为double的f函数。又定义了一个子类Derived继承于Base,其中Derived类中有一个参数为intf函数,并且在Derived中使用了using Base::f; 表示在Derived中也可以使用父类的f函数。

class Base
{
public:void f(double i){cout << "Base:" << i << endl;}
};class Derived : public Base  // 默认为public继承
{
public:using Base::f;void f(int i){cout << "Derived:" << i << endl;}
};int main()
{B(1);Base b;b.f(4.6);Derived d;d.f(4.9);d.f(4);return 0;
}

运行结果:

Base:4.6
Base:4.9
Derived:4

这里我们通过using声明,就可以看到子类Derived也可以使用父类的f函数。

继承构造函数

这里对文中最开始的那个代码进行一下改造。

class A
{
public:A(int i){}A(double d, int i){}A(float f, int i, const char* c){}
};class B : public A
{
public:using A::A; // 继承构造函数virtual void test() {};
};

在子类B中只需要添加一句using A::A;,就可以继承构造函数。

带有默认参数的构造函数

在父类带有默认参数的构造函数,对于继承构造函数来说,参数的默认值是不会被继承的。但是,默认值会导致父类产生较多个构造函数的版本,并且所有的构造函数均会被子类继承。

class A
{
public:A(int a = 3, double = 2.4){}
};class B : public A
{
public:using A::A;
};

以上面这段代码为例,就A(int a = 3, double = 2.4)一个构造函数能产生多少个构造函数版本呢??
A类中会有这些:

  1. A(int =3, double =2.4) 这就是俩个参数的版本
  2. A(int =3)这是只有一个参数的版本
  3. A(const A&)这是拷贝构造函数版本
  4. A() 这是无参构造函数版本

B类中会有这些:

  1. B(int, double) 这就是俩个参数的版本
  2. B(int =3)这是只有一个参数的版本
  3. B(const A&)这是拷贝构造函数版本 (这不是继承的)
  4. B()无参构造函数

所以在父类中有默认构造函数时,需要特别小心多个版本的构造函数的产生。

继承构造函数导致的“冲突”

这种冲突一般在多继承情况下才会存在 ,由于父类中有相同的构造函数导致的子类中有重复定义类型相同的继承构造函数。

class A
{
public:A(int a){}
};class B
{
public:B(int b) {}
};class C : public A, public B
{
public:using A::A;using B::B;
};

例如上面这个例子,这时我们就可以通过显式定义冲突的构造函数,这样就可以阻止隐式生成的继承构造函数导致的冲突。


class C : public A, public B
{
public:using A::A;using B::B;C(int c); // 显式声明冲突的构造函数
};

继承构造函数的优缺点

优点

通过这种继承构造函数的方式是隐式声明的。也就表示如果这个继承构造函数不使用,那么编译器就不会为其产生真正的函数。通过这个方式生成子类的各种构造函数比原有的方法更加简洁并且高效。

缺点

继承构造函数只能初始化父类中的成员,对于子类中成员变量只能通过C++11的初始化表达式进行设定默认值,具有一定的局限性。

如果父类的构造函数是在private作用域下,或者是子类虚继承父类,这种情况下就不能在子类中生成继承父类的构造函数了。而且子类一旦使用了继承构造函数,那么编译器就不会为子类生成默认的构造函数了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38261.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

继承与派生(Part Ⅱ)——派生类的构造函数/析构函数

派生类的构造函数和析构函数 构造函数的主要作用是对数据成员初始化。基类的构造函数是不能继承的&#xff0c;在声明派生类时&#xff0c;派生类并没有把基类的构造函数继承过来&#xff0c;因此&#xff0c;对继承过来的基类成员初始化的工作也要由派生类的构造函数承担。所…

6.12C++:继承基类的构造函数、单继承的构造函数、多继承的构造函数、派生类复制构造函数、派生类的析构函数

1 继承基类的构造函数 class A{ public:A(){}; // A的构造函数 }; class B : public A{ public:using A:A&#xff1b; }2 单继承的构造函数 class A{ public:A(int i){}; }; class B : public A{ public:B(int i, int j): A(i), bb(j); /i传递给A的构造函数&#xff0c;j初始…

JavaScript构造函数继承

首先介绍对象的call()函数和apply()函数&#xff0c;这两个函数的作用相同、用法不同。它们的作用均是指定当前调用函数的this对象是谁。 call()函数&#xff1a;在第一个传递的参数为一个对象&#xff0c;该对象为该函数的this对象&#xff0c;后面依次传递函数的实参。 apply…

c++继承构造函数

【1】为什么需要继承构造函数&#xff1f; 首先&#xff0c;看看如下代码片段&#xff1a; 1 struct A2 { 3 A(int i)4 {} 5 }; 6 7 struct B : A8 { 9 B(int i) : A(i) 10 {} 11 }; 在C中非常常见&#xff1a;B派生于A&#xff0c;B在构造函数中调用A的构造函…

openAI注册/登录 报错汇总

目录 报错类型问题原因及解决**access denied**<br />**提示An error occurred**<br />**Not available**<br />**同一IP地址频繁注册**<br />**cloudflare死循环验证**<br /> 最后 报错类型 access denied You do not have access to chat.op…

【Java面试题】真实的二面面试题(参考答案为纯个人理解)

1. 你掌握前端的哪些知识&#xff1f; vue2element-ui了解一些css,js 2. 那你说一下vue中的路由吧&#xff1f; vue中的路由是用来设定访问路径的,将路径映射到组件页面上 3. 说一下前端vue页面之间传参的方式&#xff1f; 路由查询字符串(我用的) // 路由定义 { path: /a…

yolo

目标检测 导言&#xff1a;目标检测的任务表述 如何从图像中解析出可供计算机理解的信息&#xff0c;是机器视觉的中心问题。深度学习模型由于其强大的表示能力&#xff0c;加之数据量的积累和计算力的进步&#xff0c;成为机器视觉的热点研究方向。 那么&#xff0c;如何理解…

神经网络与深度学习-学习笔记(5)

1.目标检测与YOLO 目标检测问题 目标检测是在给定的图片中精确找到物体所在位置&#xff0c;并标注出物体的类别。物体的尺寸变化范围很大&#xff0c;摆放物体的角度&#xff0c;姿态不定&#xff0c;而且可以出现在图片的任何地方&#xff0c;并且物体还可以是多个类别。 目…

可见光遥感目标检测(一)任务概要介绍

前言 本篇开始对遥感图像的目标检测进行介绍&#xff0c;介绍了其目标前景、数据集以及评价指标。 本教程禁止转载。同时&#xff0c;本教程来自知识星球【CV技术指南】更多技术教程&#xff0c;可加入星球学习。 Transformer、目标检测、语义分割交流群 欢迎关注公众号CV技…

YOLOv5全面解析教程①:网络结构逐行代码解读

撰文 | Fengwen, BBuf 本教程涉及的代码在&#xff1a; https://github.com/Oneflow-Inc/one-yolov5 教程也同样适用于 Ultralytics/YOLOv5&#xff0c;因为 One-YOLOv5 仅仅是换了一个运行时后端而已&#xff0c;计算逻辑和代码相比 Ultralytics/YOLOv5 没有做任何改变&#x…

可见光遥感图像目标检测(三)文字场景检测之Arbitrary

前言 前面介绍了关于可见光遥感图像目标检测任务主要面临的问题&#xff0c;现在对旋转目标的问题进行优化&#xff0c;为了便于大家理解与之前通用目标检测区别&#xff0c;采用Faster-Rcnn网络模型的架构对旋转目标的检测进行改进。 本教程禁止转载。同时&#xff0c;本教程来…

yolov5的简单使用

yolov5是什么 来自chatGPT的描述如下 YOLOv5是一种目标检测算法&#xff0c;它是YOLO系列算法的最新版本&#xff0c;由Joseph Redmon和Alexey Bochkovskiy等人开发。与之前的版本相比&#xff0c;YOLOv5在准确性和速度方面都有所提高。YOLOv5使用一种名为“Bag of Freebies”…

yolov3_spp项目中的各种配置文件读取

目录 1. open 函数 2. cfg文件夹下文档解析 2.1 hyp.yaml 2.2 my_yolov_3.cfg 3. data文件夹下文档解析 3.1 my_data.data 3.2 其它 后缀名 .ymal .txt .json .cfg .data .names .shapes 可以自定义后缀名&#xff1f;&#xff1f; pyhon文件操作大…

目标检测算法——YOLOv5/YOLOv7改进之结合CBAM注意力机制

&#x1f496;&#x1f496;>>>加勒比海带&#xff0c;QQ2479200884<<<&#x1f496;&#x1f496; &#x1f340;&#x1f340;>>>【YOLO魔法搭配&论文投稿咨询】<<<&#x1f340;&#x1f340; ✨✨>>>学习交流 | 温澜潮…

​目标检测算法——YOLOv5/YOLOv7改进之结合Criss-Cross Attention

&#xff08;一&#xff09;前沿介绍 论文题目&#xff1a;CCNet: Criss-Cross Attention for Semantic Segmentation 论文地址&#xff1a;https://arxiv.org/pdf/1811.11721.pdf 代码地址&#xff1a;https://github.com/shanglianlm0525/CvPytorch 本文是ICCV2019的语义分…

目标检测算法——YOLOv5/YOLOv7改进之GSConv+Slim Neck(优化成本)

>>>深度学习Tricks&#xff0c;第一时间送达<<< 目录 &#xff08;一&#xff09;前言 1.GSConv模块 2.Slim Neck&#xff08;GSBottleneckVoVGSCSP&#xff09; &#xff08;二&#xff09;YOLOv5改进之GSConvSlim Neck 1.配置common.py文件 2.配置yo…

目标检测算法——YOLOv5改进|增加小目标检测层

&#x1f496;&#x1f496;>>>加勒比海带&#xff0c;QQ2479200884<<<&#x1f496;&#x1f496; &#x1f340;&#x1f340;>>>【YOLO魔法搭配&论文投稿咨询】<<<&#x1f340;&#x1f340; ✨✨>>>学习交流 | 温澜潮…

【学习笔记】YOLOv5训练自己的数据集

训练自己的数据集进行总结&#xff0c;方便接下来的学习 目录 1.设置文件夹 2.标记自己的数据集 2.1在百度图片上找到自己想要的图片并批量下载 2.2labelimg软件的使用 3.修改配置文件 3.1AOCAO parameter.yaml 3.2AOCAO model.yaml 4.开始训练 4.1改代码 4.2训练过…

Tips and tricks for Neural Networks 深度学习训练神经网络的技巧总结(不定期更新)

文章目录 本文说明Debug 技巧Overfit一个简单的Batch无法复现之前的结果 数据处理平衡数据数据增强&#xff08;Data Augmentation&#xff09;图片增强 使用Embedding数据压缩数据标准化&#xff08;Normalization&#xff09;标签平滑&#xff08;LabelSmoothing&#xff09;…

官方正品 | Ultralytics YOLOv8算法来啦(尖端SOTA模型)

&#x1f496;&#x1f496;>>>加勒比海带&#xff0c;QQ2479200884<<<&#x1f496;&#x1f496; &#x1f340;&#x1f340;>>>【YOLO魔法搭配&论文投稿咨询】<<<&#x1f340;&#x1f340; ✨✨>>>学习交流 | 温澜潮…