前言

首先我们来看一种情况,有如下示例:

class Base
{public:Base(int i):x(i),y(0){}Base(int i,double j):x(i),y(j){}Base(int i,double j,const string & str):x(i),y(j),s(str){}private:int x;double y;string s;
};class Derived : Base
{};int main()
{Derived d(1,3.2,"hello"); //error:没有合适的构造函数return 0;
}

以上示例就是说,如果有一个派生类,希望能和基类一样采取相同的构造方式,其直接派生于基类是不能获取基类构造函数的,因为,C++派生类会隐藏基类同名函数。
所以Derived d(1,3.2,“hello”);调用会直接报错,因为派生类的默认构造函数隐藏了积累。如果希望使用基类的构造函数,一个可行的 方法就是在派生类中也定义这些构造函数并依次调用基类。
如下:

class Base
{public:Base(int i):x(i),y(0){}Base(int i,double j):x(i),y(j){}Base(int i,double j,const string & str):x(i),y(j),s(str){}private:int x;double y;string s;
};class Derived : Base
{public:Derived(int i):Base(i){}Derived(int i,double j):Base(i,j){}Derived(int i,double j,const string & str):Base(i,j,str){}
};int main()
{Derived d1(1);Derived d2(1,3.2);Derived d3(1,3.2,"hello");return 0;
}

继承构造函数

以上方法虽然可行,但是代码非常繁琐切重复性高,而C++11中的继承构造函数特征正是用于解决派生类隐藏基类同名函数的问题。

可以通过 using Base::SomeFunction来表示使用基类的同名函数。 所以以上示例,通过 using Base::Base;来声明使用基类的构造函数,就可以在派生类中不用定义相同的构造函数了,直接使用基类的构造函数来构造派生类对象。

class Base
{public:Base(int i):x(i),y(0){}Base(int i,double j):x(i),y(j){}Base(int i,double j,const string & str):x(i),y(j),s(str){}private:int x;double y;string s;
};class Derived : Base
{public:using Base::Base;  //声明使用基类的构造函数
};
int main()
{Derived d1(1);Derived d2(1,3.2);Derived d3(1,3.2,"hello");return 0;
}

需要注意的是,继承构造函数不会去初始化派生类新定义的数据成员。

考虑一种情况,如果通过 using Base::Base;来声明使用基类的构造函数,但是同时又在派生类中定义相同构造函数,会出现什么结果。
如下示例:

class Base
{public:Base(int i):x(i),y(0){}Base(int i,double j):x(i),y(j){}Base(int i,double j,const string & str):x(i),y(j),s(str){cout << "this is Base." << endl;}private:int x;double y;string s;
};class Derived : Base
{public:using Base::Base;  //声明使用基类的构造函数Derived(int i,double j,const string & str):Base(i,j,str){cout << "this is Derived." << endl;}
};
int main()
{Derived d1(1);Derived d2(1,3.2);Derived d3(1,3.2,"hello");return 0;
}

输出结果:

this is Base.
this is Derived.

也就是说,如果通过 using Base::Base;来声明使用基类的构造函数,但是同时又在派生类中定义相同构造函数,这时候调用Derived d3(1,3.2,“hello”);, 产生的结果是,会直接调用派生类中的构造函数。

该特性不仅对构造函数有用,对其他同名函数也适用。

class Base
{public:void fun(int a){cout << "call in Base Fun";}
};class Derived : Base
{public:
//    using Base::fun;void fun(int a){cout << "call in Derived Fun";}
};int main()
{Derived d1;d1.fun(4);return 0;
}

以上示例,会输出结果 call in Derived Fun,因为派生类中的fun函数隐藏了基类中的函数,如果派生类中没有定义fun,那么无法从派生类对象调用基类的fun函数,这时候可以定义 using Base::fun; 然后就可以调用啦。

class Base
{public:void fun(int a){cout << "call in Base Fun";}
};class Derived : Base
{public:using Base::fun;
};int main()
{Derived d1;d1.fun(4);return 0;
}

C++11:继承构造函数相关推荐

  1. [C++11]继承构造函数

    C++11中提供的继承构造函数可以让派生类直接使用基类的构造函数,而无需自己再写构造函数,尤其是在基类有很多构造函数的情况下,可以极大地简化派生类构造函数的编写. 先来看没有继承构造函数之前的处理方式 ...

  2. C++11 继承构造函数

    1.简介 子类为完成基类初始化,在 C++11 之前,需要在初始化列表调用基类的构造函数,从而完成构造函数的传递.如果基类拥有多个构造函数,那么子类也需要实现多个与基类构造函数对应的构造函数. cla ...

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

    系列文章 C++11之正则表达式(regex_match.regex_search.regex_replace) C++11之线程库(Thread.Mutex.atomic.lock_guard.同步 ...

  4. c++11 继承构造

    c++11 继承构造 #define _CRT_SECURE_NO_WARNINGS#include <iostream> #include <string> #include ...

  5. 委托构造函数继承构造函数

    委托构造函数 委托构造函数的引入 小明和李华给外国友人写信从高中写到了考研写累了,突然想唱歌,为了方便这哥俩唱歌,咱写了个唱歌类给他们.这哥俩唱的不好,就限制他俩只能唱三句.因为有1~3句的选择,就写 ...

  6. C++进阶教程 - 委托构造函数和继承构造函数

    委托构造函数 什么是委托构造函数? 委托构造函数是由C++11引入的新概念,是对C++构造函数的改进,允许构造函数使用初始化列表调用同类中的其他构造函数,旨在简化构造函数的书写,提升代码的可维护性,降 ...

  7. C/C++编程:继承构造函数

    引入 在传统C++中,如果派生类要使用使用基类的构造函数,通常需要在构造函数中显式声明: struct A{public:A(int i) {} };struct B : A{B (int i) : ...

  8. C++三大继承构造函数的执行顺序详解

    写的挺好的,关于继承和构造函数的先后顺序问题. 转自: http://blog.csdn.net/daheiantian/archive/2011/02/18/6438782.aspx 一.单继承 核 ...

  9. java中子类继承父类时是否继承构造函数

    java继承中对构造函数是不继承的,只是调用(隐式或显式). 以下是例子: public class FatherClass { public FatherClass() {        Syste ...

最新文章

  1. mysql 查看运行级别_Linux的运行级别和chkconfig用法
  2. 持续集成之路——Maven
  3. Java学习笔记28
  4. 虚拟机内 docker启动 局域网无发访问 问题解决
  5. 长沙医学院计算机系怎么样,长沙医学院有哪些专业及什么专业好
  6. python入门到实践-一本书搞定Python入门到实践
  7. 技术团队新官上任之中层篇
  8. 工业三防手持终端如何选
  9. 美国硅谷预测10年后的世界,再不懂你就落伍了
  10. pythondev更新到3_python版本升级到3.7
  11. AFNetworking源码学习
  12. 20170521第三讲
  13. 360度测试:KAFKA会丢数据么?其高可用是否满足需求?
  14. iMazing支持哪些数据类型
  15. 【Proteus仿真】51单片机+红外测距仪(GP2D12)+ADC0809模数转换
  16. Alexa世界排名作弊分析
  17. 联想台式计算机内置网卡,联想台式机有没有无线网卡
  18. C语言程序的undefined,c语言中undefined reference to 怎么解决
  19. Pytorch简单实现seq2seq+Attention机器人问答
  20. 2015 计蒜之道 初赛 第一场 搜狗输入法的分词算法

热门文章

  1. 13个大奖任你拿,网易MINI开发挑战赛强势来袭!
  2. 视频智能去水印:从数学建模到工程实现
  3. 喜大普奔,网易猪肉要到你碗里来了!
  4. 几个关于tableView的问题解决方式整合
  5. PostgreSQL中如何查看一个表所对应的文件
  6. PowerShell管理Azure
  7. 关于Exchang server 2010 MCITP
  8. [Prism]Composite Application Guidance for WPF(10)——系列目录导航
  9. 【期末】202I-2022 IT项目管理期末考试(广州大学)
  10. 内核函数 系统调用 系统命令 库函数