当前位置: 首页 > news >正文

19.10、C++11新特性有哪些⑩【继承构造函数】

当需要在子类中初始化父类的变量时(也就是在子类中调用父类的构造函数),我们不需要一个一个地委托父类的构造函数,而是直接使用继承构造函数即可:

using Base::Base //base时父类的名字

使用继承构造函数,就表示在子类中调用父类的构造函数(公有的),按照父类构造函数的方式初始化父类的变量

  • 不使用继承构造函数:
  class TestA {
  public:
      TestA(string i): a1(i) {}
      TestA(int i) : a2(i) {}
      TestA(double i) : a3(i) {}
      ~TestA() {}
      string geta1() {
          return a1;
      }
      virtual string getb1() = 0;
  private:
      string a1;
      int a2;
      double a3;
  };
  
  class TestB: public TestA{
  public:
      //一个一个写
      TestB(string i):TestA(i),b1(i) {}
      TestB(int i) :TestA(i), b2(i) {}
      TestB(double i) :TestA(i), b3(i) {}
      
      ~TestB() {}
      virtual string getb1() override {
          return b1;
      }
      virtual void testb();
  private:
      string b1;
      int b2;
      double b3;
  };
  • 使用继承构造函数:
  class TestA {
  public:
      TestA(string i): a1(i) {}
      TestA(int i) : a2(i) {}
      TestA(double i) : a3(i) {}
      ~TestA() {}
      string geta1() {
          return a1;
      }
      virtual string getb1() = 0;
  private:
      string a1;
      int a2;
      double a3;
  };
  
  class TestB: public TestA{
  public:
      // 继承构造函数
  	using TestA::TestA; //直接调用TestA中的构造函数
  	// ....
      virtual void testb();
  private:
      string b1;
      int b2;
      double b3;
  };
  • 其实继承构造函数本质上就是 在子类中初始化父类的变量,所以它并不能初始化子类自己的变量。那使用继承构造函数之后,子类如何初始化自己的变量呢?

    1. 直接就地初始化(针对非静态成员变量),即 = 或 { }
 class Derived: public Base {
 public:
 	// 使用继承构造函数
 	using Base::Base;
 	// 假设派生类只是添加了一个普通的函数
 	void display() {
 		// do something		
 	}
 private:
 	// 派生类新增数据成员
 	double _double{0.0}; //直接用{}
 };
  1. 用子类的构造函数初始化,在初始化列表中初始化(没有第一种简洁)
 class Derived :public Base {
 public:
 	// 使用继承构造函数
 	using Base::Base;
 
 	// 新增派生类构造函数
 	Derived(int a, double b):Base(a), _double(b){}//在初始化列表中初始化
 
 	// 假设派生类只是添加了一个普通的函数
 	void display() {
 		// do something		
 	}
 private:
 	// 派生类新增数据成员
 	double _double{0.0};//本地初始化 会被初始化列表 覆盖
 };
  • 注意,当基类的构造函数由默认值时,子类的构造函数不会继承这个默认值,同时会产生多个版本的几倍构造函数:
  class A {
  public:
  	A(int a = 3, double b = 4): _a(a), _b(b){}
  	void display() {
  		cout<<_a<<" "<<_b<<endl;
  	}
  
  private:
  	int _a;
  	double _b;
  };
  
  class B:public A {
  public:
  	using A::A;
  };
  /*
  A中的构造函数有下面这几个版本:
  	A()
  	A(int)
  	A(int, double)
  	A(const A&)
  
  B中的继承构造函数有下面这几个版本
  	B()
  	B(int)
  	B(int, double)
  	B(const B&)	 */

相关文章:

  • 洛谷 P1850 [NOIP 2016 提高组] 换教室(期望DP)【 提高+/省选−】
  • Unity ECS与MonoBehaviour混合架构开发实践指南
  • 深入解析SpringMVC中Http响应的实现机制
  • ASP.NET Core JWT认证与授权
  • rust学习笔记12-hashmap与1. 两数之和
  • 【C语言】值传递与指针传递,以及 `.` 和 `->` 操作详解
  • 设备预测性维护的6大应用场景
  • vue 安装依赖npm install过程中报错npm ERR! cb() never called!
  • 【电控笔记z69】电机选型-机械特性
  • deepseek本地集群部署调研
  • GCC RISCV 后端 -- cc1 入口
  • 批量插入对比-mysql-oracle-sqlserver
  • Three.js 新前端学习
  • tauri-plugin-shell插件将_blank的a标签用浏览器打开了,,,解决办法
  • android为第三方提供部分系统接口
  • Linux 系统不同分类的操作命令区别
  • Windows系统编程(八)线程同步
  • 【gRPC】Java高性能远程调用之gRPC详解
  • 大语言模型中温度参数(Temperature)的核心原理
  • 大学至今的反思与总结
  • 国家外汇管理局:4月货物贸易项下跨境资金净流入649亿美元
  • 国家统计局:中美大幅降低关税有利于双方贸易增长,也有利于世界经济复苏
  • 十大券商看后市|A股指数有望进一步缓步推高,淡化短期波动
  • 以色列称“将立即允许恢复”人道主义物资进入加沙
  • 西藏普兰县公安局网安大队向自媒体人宣传网络安全知识
  • 殷墟出土鸮尊时隔50年首次聚首,北京新展“看·见殷商”