C++ 语言特性11 - 继承构造函数

news2024/10/11 15:10:56

一:概述

        在C++中,直到C++11标准发布之前,派生类(子类)不能直接继承基类的构造函数。如果基类有多个构造函数,派生类需要显式地为每一个基类构造函数编写对应的派生类构造函数。这不仅增加了代码量,也提高了维护成本,因为基类构造函数的任何修改都需要在所有派生类中进行相应的更新。

        C++11标准引入了继承构造函数的概念,允许派生类通过using声明来继承基类的构造函数。这使得派生类可以直接使用基类的构造函数来初始化其继承的基类部分,而不需要在派生类中显式地重写或复制这些构造函数的初始化代码

二:例子

class Base {
public:
    Base(int x) : value(x) {}
    Base(double x) : value(static_cast<int>(x)) {}
    
private:
    int value;
};

class Derived : public Base {
public:
    using Base::Base;  // 继承构造函数

    // 派生类特有的成员和方法
    void print() const {
        std::cout << "Value: " << value << std::endl;
    }
};

int main() {
    Derived d1(10);       // 调用 Base(10)
    Derived d2(3.14);     // 调用 Base(3.14)
    d1.print();
    d2.print();
    return 0;
}

三:使用继承构造的注意事项

 

  • 访问权限: 只有公开(public)或受保护(protected)的基类构造函数可以被派生类继承。私有(private)构造函数不能被继承。

class Base {
private:
    Base(int x) {}  // 私有构造函数
};

class Derived : public Base {
public:
    using Base::Base;  // 错误:不能继承私有构造函数
};
  • 构造函数的匹配: 派生类继承的构造函数必须与基类的构造函数具有相同的参数类型和顺序。

class Base {
public:
    Base(int x) {}
};

class Derived : public Base {
public:
    using Base::Base;  // 错误:参数类型不匹配
    Derived(double x) : Base(x) {}  // 尝试将double转换为int
};
  • 继承构造函数的声明顺序using声明必须在派生类中所有成员定义之前出现,包括构造函数和析构函数。

class Base {
public:
    Base(int x) {}
};

class Derived : public Base {
public:
    int value;
    using Base::Base;  // 错误:声明顺序不正确
};
  • 参数的默认值: 基类构造函数中的默认参数值不会被继承。派生类继承的构造函数将忽略这些默认值。

class Base {
public:
    Base(int x = 10) {}  // 带有默认参数的构造函数
};

class Derived : public Base {
public:
    using Base::Base;  // 默认参数不会被继承
};
  • 构造函数的重定义: 如果派生类定义了自己的构造函数,那么与基类构造函数具有相同签名的继承构造函数将被覆盖。

class Base {
public:
    Base(int x) {}
};

class Derived : public Base {
public:
    Derived(int x) : Base(x) {}  // 重定义构造函数
    using Base::Base;  // 错误:与派生类的构造函数冲突
};
  • 多重继承: 在多重继承的情况下,派生类可能会从多个基类继承构造函数。如果构造函数的参数列表相同,派生类需要明确指定使用哪个基类的构造函数。

class Base1 {
public:
    Base1(int x) {}
};

class Base2 {
public:
    Base2(int x) {}
};

class Derived : public Base1, public Base2 {
public:
    using Base1::Base1;  // 错误:与Base2构造函数冲突
    using Base2::Base2;
};
  • 继承与类模板: 在模板类中使用继承构造函数时,需要确保模板参数不会影响构造函数的可行性。

template <typename T>
class Base {
public:
    Base(T x) {}
};

class Derived : public Base<int> {
public:
    using Base::Base;  // 错误:模板参数导致构造函数不匹配
};
  • 继承构造函数与默认构造函数: 如果派生类使用了继承构造函数,编译器不会自动生成默认构造函数,除非基类也没有默认构造函数。

class Base {
public:
    Base(int x) {}
};

class Derived : public Base {
public:
    using Base::Base;  // 没有默认构造函数
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线下餐厅自主点餐或外卖配送小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 线下餐厅自主点餐或外卖配送小程序源码系统是一款专为餐饮行业打造的智能化解决方案。它融合了自主点餐、外卖配送、订单管理、数据分析等多种功能&#xff0c;为餐厅提供了一站式的服务平台。通过该系统&#xff0c;餐厅可以实现线上线下一体化运营&#xff0c;提高工…

猿人学 — 第1届第3题(解题思路附源码)

猿人学 — 第1届第3题 翻页发现一共有两个请求 第一个请求&#xff1a;返回状态码为202&#xff08;服务器已经接收请求&#xff0c;但尚未处理&#xff09;&#xff0c;响应头中还有一个Set-Cookie 第二个请求&#xff1a;返回了我们想要的数据&#xff0c;携带的Payload中…

基于M芯片MAC系统的hadoop、zookeeper、hbase安装

hadoop、zookeeper、hbase安装 1. vmware配置 搜索&#xff1a;“vmware for mac”&#xff0c;购买正版并下载&#xff0c;或通过其他渠道下载均可 随机掉落的奇怪链接 2. 下载镜像并安装虚拟机 bug记录1 此处选用ubuntu的20以及24&#xff0c;分别出现无法加载安装程序、…

会话管理:深入理解SQLAlchemy会话及其事务处理

引言 SQLAlchemy是一个流行的Python SQL工具包和对象关系映射&#xff08;ORM&#xff09;系统&#xff0c;它提供了一个高层的ORM以及底层的SQL表达式语言。在SQLAlchemy中&#xff0c;会话&#xff08;Session&#xff09;是与数据库交互的核心概念&#xff0c;它不仅负责对…

外卖配送小程序源码系统 带源代码包以及搭建部署教程

系统概述 外卖配送小程序源码系统是一套完整的解决方案&#xff0c;旨在帮助用户快速搭建自己的外卖配送平台。它融合了先进的技术和创新的设计理念&#xff0c;为用户提供了一个稳定、高效、易用的系统环境。 该系统基于移动端开发&#xff0c;能够与各种操作系统兼容&#…

2.stm32 GPIO输出

GPIO简介 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口 可配置为8种输入输出模式 引脚电平&#xff1a;0V~3.3V&#xff0c;部分引脚可容忍5V 输出模式下可控制端口输出高低电平&#xff0c;用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等 …

网络变压器的作用是什么

在网络通讯主板上,在PHY芯片与RJ45连接器之间,会有一个黑属的小方块,这个东西就叫网络变压器,书名"数据录”人们常把它称为网络隔真变压务,LAN变压客,局域网变压器,滤波器等。 它在一块网络设备接口上所起的作用主要有两个; 一、传输数据,它把PHY送出来的差分信号用差模合…

电子元器件是电子电路中的基本组成部分

电子元器件是电子电路中的基本组成部分&#xff0c;主要包括以下几类&#xff1a; 一、电阻器 作用 限流&#xff1a;限制电路中的电流大小。分压&#xff1a;将电压按照一定比例分配。负载&#xff1a;作为电路中的负载元件。 分类 固定电阻&#xff1a;阻值固定不变。可变电阻…

ros1编译wpr_simulation库

目录 安装项目依赖包编译将环境参数加载到终端程序中运行编译好的ros程序 首先你下载好这个库以后。 安装项目依赖包 scripts库中&#xff0c;存放的是一些依赖项安装脚本以及python脚本。 进入到这个路径的终端。 输入 ./install_for_noetic.sh编译 输入下面命令&#xf…

小猿口算自动PK脚本

大家好&#xff0c;我是小黄。 近期&#xff0c;众多大学生炸鱼小猿口算APP,把一众小学生都快虐哭了&#xff0c;小黄听闻后&#xff0c;也跃跃欲试。对此小黄也参考网上的资料写了一个自动Pk的脚步。 首先大家需要安装一个pytorch环境过程中&#xff0c;如果小伙伴对此不熟悉的…

【YOLOv11】ultralytics最新作品yolov11 AND 模型的训练、推理、验证、导出 以及 使用

​目录 一 ultralytics公司的最新作品YOLOV11 1 yolov11的创新 2 安装YOLOv11 3 PYTHON Guide 二 训练 三 验证 四 推理 五 导出模型 六 使用 文档&#xff1a;https://docs.ultralytics.com/models/yolo11/ 代码链接&#xff1a;https://github.com/ultralytics/ult…

MyBatis 用法详解

文章目录 一、普通 SQL1.1 注解实现&#xff1a;1.1.1 参数传递&#xff1a;1.1.2 增&#xff08;Insert&#xff09;&#xff1a;1.1.3 删&#xff08;Delete&#xff09;&#xff1a;1.1.4 改&#xff08;Update&#xff09;&#xff1a;1.1.5 查&#xff08;Select&#xff…

大疆M2006+C610 pid参数调优

官方给的示例代码里给的是1.5, 0.1, 0 但试了下空转时显然不太行. 自己摸索出0.8, 0.03, 0 表现如图中的蓝色线 期望速度先两秒的1000,然后一秒的2000,一秒的3000, 0 2000 表现还不错,可以看到0.5秒后与期望值的差距控制在大概10%之内,但还是感觉有些过调 对了先说一下基础知识…

UnityComputeShader Challenge2

UnityComputeShader Challenge2 大部分内容与Challenge1中的一致&#xff0c;重复的地方不做说明 using UnityEngine; using System.Collections;public class Challenge2 : MonoBehaviour {public ComputeShader shader;//纹理的分辨率&#xff0c;正方形public int texReso…

PHP拼团接龙商城系统小程序源码

拼团接龙商城系统&#xff0c;解锁购物新乐趣&#xff01; &#x1f389; 拼团接龙&#xff0c;购物也能玩出新花样 你是否厌倦了单调的购物方式&#xff1f;想要尝试一种既有趣又实惠的购物新体验&#xff1f;那么&#xff0c;“拼团接龙商城系统”绝对是你的不二之选&#…

fluke双绞线测试-外部串扰AxTALK-测试DEMO样本

外部串扰是电缆束或跳线中相邻电缆之间传输的噪音或串扰。外部串扰是 10GBASE-T 通信应用中主要的噪音源。 电缆线对&#xff08;NEXT 和 FEXT&#xff09;之间的串扰信号与传输信号有关&#xff0c;所以网络设备可以利用数字信号处理 (DSP) 技术除去数据信号中的串扰信号。但…

力扣题11~20

题11&#xff08;中等&#xff09;&#xff1a; 思路&#xff1a; 这种题目第一眼就是双循环&#xff0c;但是肯定不行滴&#xff0c;o(n^2)这种肯定超时&#xff0c;很难接受。 所以要另辟蹊径&#xff0c;我们先用俩指针&#xff08;标志位&#xff09;在最左端和最右端&am…

Android iOS 使用 ARMS 用户体验监控(RUM)的最佳实践

作者&#xff1a;元泊 引言 背景信息 随着移动互联网技术的持续演进与全民互联网时代的深入&#xff0c;用户在 Android、iOS 应用程序、小程序、H5 游戏及网页等多元化平台上的交互时长显著增长。这一趋势加剧了用户体验&#xff08;UX&#xff09;场景的复杂性&#xff0c…