C++底稿(第5版)第629页写道:
我自己尝试过,在我看来,编译器生成的派生构造函数与基本构造函数具有相同的默认参数。
下面是一个小小的测试:
#include <iostream>
struct Base
{
Base() = default;
Base(int x_, int y_ = 88, int z_ = 99)
: x(x_), y(y_), z(z_) {}
virtual void debug() const
{ std::cout << "\nx - " << x << ", y - " << y << ", z - " << z << '\n'; }
private:
int x, y, z;
};
struct Derived : Base
{
using Base::Base;
};
int main() {
Base B(1);
B.debug(); // x - 1, y - 88, z - 99
Derived D(5);
D.debug(); // x - 5, y - 88, z - 99
return 0;
}(您可以在这里运行- http://coliru.stacked-crooked.com/a/26cbb85757c1f021 )
那么,我们是否也继承了继承构造函数的默认参数?
如果不是,为什么我没有得到最后两个成员的垃圾,但是与从基继承的构造函数的默认论证值相同?
他还在互联网上搜索了有关此事的明确回应,但没有发现任何回应。
发布于 2015-08-05 11:51:18
来自class.inhctor
从使用声明中命名的类X中继承的候选构造函数集由实际的构造函数和由默认参数和省略参数规范转换而成的名义构造函数组成,如下所示: -. -对于至少有一个参数具有默认参数的x的每个非模板构造函数,由省略任何省略参数规范的构造函数集和从参数类型列表的末尾连续省略带有默认参数的参数的构造函数集,以及 -.
我们有两个Base的非模板构造函数.Base的默认构造函数引入候选对象:
Derived() : Base() { }Base的另一个构造函数为每个连续省略的参数引入了一个候选参数。即:
Derived(int x, int y, int z) : Base(x, y, z) { }
Derived(int x, int y) : Base(x, y) { }
Derived(int x) : Base(x) { }默认参数是,而不是继承的--我们只是为每个参数获得不同的构造函数。所以Derived(5)只是简单地调用Base(5),而不是Base(5, 88, 99)。
最终的结果是一样的
发布于 2015-08-05 11:41:19
你从书中引用的话不完整。
如果基类构造函数具有默认参数(§6.5.1,第236页),则不会继承这些参数。相反,派生类将获得多个继承构造函数,其中每个带有默认参数的参数都会被连续省略。例如,如果基具有两个参数的构造函数(第二个参数具有默认值),则派生类将获得两个构造函数:一个具有两个参数(没有默认参数),另一个构造函数具有与基类中最左边的非默认参数对应的单个参数。
因此,派生类将有3个具有签名的继承构造函数:
Derived (int x): Base{x} {}
Derived (int x, int y): Base{x, y} {}
Derived (int x, int y, int z): Base{x, y, z} {}因此,您是而不是,它继承了基类中的任何默认参数。
Derived D(5);调用上述三个构造函数中的第一个,并调用基本构造函数如下
Base(5)还请注意,默认的、复制的和移动的构造函数不是继承的。这些构造函数是用正规规则合成的。继承构造函数不被视为用户定义的构造函数。因此,只包含继承构造函数的类将具有一个合成的默认构造函数。
https://stackoverflow.com/questions/31830780
复制相似问题