继承的构造函数

一、继承的构造函数

在C++11新标准中,派生类能够重用其直接基类的构造函数。尽管如我们所知,这些构造函数并非以常规的方式继承而来,但是为了方便,我们不妨姑且称其为“继承”的。一个类只初始化它的直接基类,出于同样的原因,一个类也只继承其直接基类的构造函数。类不能继承默认、拷贝和移动构造函数。如果派生类没有直接定义这些构造函数,则编译器将为派生类合成它们。

派生类继承基类构造函数的方式是提供一条注明了(直接)基类名称的using声明语句。举个例子,我们定义Bulk_quote类,如下:

 

class Bluk_quote:public Disc_quote{
    public:
        Bluk_quote()=default;
        Bluk_quote(const string& book,double price,size_t qty,double disc):Disc_quote(book,price,qty,disc){}
        double net_price(size_t) const override;
};

我们可以重新定义Bulk_quote类,令其继承Disc_quote类的构造函数:

class Bluk_quote:public Disc_quote{
    public:
        using Disc_quote::Disc_quote;   //继承Disc_quote的构造函数
        double net_price(size_t) const override;
};

通常情况下,using声明语句只是令某个名字在当前作用域内可见。而当作用于构造函数时,using声明语句将令编译器产生代码。对于基类的每个构造函数,编译器都生成一个与之对应的派生类构造函数。换句话说,对于基类的每个构造函数,编译器都在派生类中生成一个形参列表完全相同的构造函数。

这些编译器生成的构造函数形如:

derived(parms):base(args){}

其中,derived是派生类的名字,base是基类的名字,parms是构造函数的形参列表,args将派生类构造函数的形参传递给基类的构造函数。在我们的Bulk_quote类中,继承的构造函数等价于:

 Bluk_quote(const string& book,double price,size_t qty,double disc):Disc_quote(book,price,qty,disc){}

如果派生类含有自己的数据成员,则这些成员将被默认初始化。

二、继承的构造函数的特点

和普通成员的using声明不一样,一个构造函数的using声明不会改变该构造函数的访问级别。例如,不管声明出现在哪儿,基类的私有构造函数在派生类中还是一个私有构造函数;受保护的构造函数和公用的构造函数也是同样的规则。

而且,一个using声明语句不能指定explicit或constexpr。如果基类的构造函数是explicit或者constexpr,则继承的构造函数也拥有相同的属性。

当一个基类构造函数含有默认实参时,这些实参并不会被继承。相反,派生类将获得多个继承的构造函数,其中美国构造函数分别省略掉一个含有默认实参的形参。例如,如果基类有一个接受两个形参的构造函数,其中第二个形参含有默认实参,则派生类将获得两个构造函数:一个构造函数接受两个形参(没有默认参数),另一个构造函数只接受一个形参,它对应于基类中最左侧的没有默认值的那个形参。

如果基类含有几个构造函数,则除了两个例外情况,大多数时候派生类会继承所有这些构造函数。第一个例外是派生类可以继承一部分构造函数,而为其他构造函数定义自己的版本。如果派生类定义的构造函数与基类的构造函数有相同的参数列表,则该构造函数将不会被继承。定义在派生类中的构造函数将替换继承而来的构造函数。

第二个例外是默认、拷贝和移动构造函数不会被继承。这些构造函数安装正常规则合成。继承的构造函数不会被作为用户定义的构造函数来使用,因此,如果一个类只含有继承的构造函数,则它也将拥有一个合成的默认构造函数。

时间: 2024-10-28 03:10:30

继承的构造函数的相关文章

vc6 0-关于继承的构造函数的问题

问题描述 关于继承的构造函数的问题 代码如下: #include #include using namespace std; class A { public: string name; A (string); }; class B : public A { public: B (); }; A::A (string name = "") { this->name = name; } B::B () { ; } int main() { B b; return 0; } 在vs2

JavaScript 原型继承之构造函数继承_javascript技巧

上回说到<JavaScript 原型继承之基础机制>,这一篇将具体说说构造函数的继承. 从一个简单的示例开始,创建描述人类的 People 构造函数: 复制代码 代码如下: function People(){ this.race = '愚蠢的人类'; } 然后,创建描述黄种人的 Yellow 构造函数: 复制代码 代码如下: function Yellow(name, skin){ this.name = name; this.skin = skin; } 要使得黄种人 Yellow 能继承

关于C#继承,继承父类构造函数时报错?

问题描述 请教,如下,代码长,就收缩截图了.为什么子类在base引用父类构造函数时候,变量出错? 解决方案 解决方案二: 解决方案三:找到错误了,唉,真低级啊!解决方案四:这肯定是意外解决方案五:报错的变量没有定义,Students的构造函数中加入这些参数.

浅谈JS继承_借用构造函数 &amp; 组合式继承_javascript技巧

2.借用构造函数 为解决原型中包含引用类型值所带来的问题, 我们使用一种叫做 借用构造函数(constructor stealing)的技术(又叫伪造对象或经典继承). 这种技术的基本思想:在子类构造函数内部调用超类型构造函数. 通过使用apply()和call()方法可以在新创建的子类对象上执行构造函数. function SuperType(){ this.colors = ["red", "blue", "green"]; } functi

JS继承之借用构造函数继承和组合继承_javascript技巧

借用构造函数继承  在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术(有时候也叫做伪造对象或经典继承).这种技术的基本思想相当简单,即在子类型构造函数的内部调用超类型构造函数.  基本模式 function SuperType(){ this.colors = ["red", "blue", "green"]; } function SubType(){ //继承

php构造函数的继承方法_php技巧

本文实例讲述了php构造函数的继承方法.分享给大家供大家参考.具体如下: 第一种情况:子类没有定义构造函数时,默认继承.例子: <?php class A{ public $name; function __construct(){ echo $this->name="小强"; } } class B extends A{ } $bb = new B(); ?> 输出结果:小强 第二种情况:子类定义了构造函数,则不会被继承.实例: <?php class A{

Javascript非构造函数的继承_javascript技巧

一.什么是"非构造函数"的继承? 比如,现在有一个对象,叫做"中国人". 复制代码 代码如下: var Chinese = { nation:'中国' }; 还有一个对象,叫做"医生". 复制代码 代码如下: var Doctor ={ career:'医生' } 请问怎样才能让"医生"去继承"中国人",也就是说,我怎样才能生成一个"中国医生"的对象? 这里要注意,这两个对象都是普通对象

JavaScript对象的继承

1.对象冒充 对象冒充指的是在子类中使用子类的this冒充父类的this去执行父类的构造函数,从而获得了父类的属性和方法,但是这种方式只能继承父类构造函数中定义的属性和方法,原型上的任何属性和方法对子类都不可见:         //使用对象冒充实现继承          function SuperType()      {          this.prop = ["prop"];                    this.method = function(){retur

编程算法:求1+2+...+n(函数继承) 代码(C++)

题目: 求1+2+...+n, 要求不能使用乘除法\for\while\if\else\switch\case等关键字及条件判断语句(A?B:C). 可以使用函数继承, 通过递归调用, 每次递归值减1, 使用求反运算(!), 即非0为0, 0为1. 代码: /* * main.cpp * * Created on: 2014.7.12 *本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/ * Autho