BadCatss Asked:2020-04-12 21:24:23 +0000 UTC2020-04-12 21:24:23 +0000 UTC 2020-04-12 21:24:23 +0000 UTC 构造函数的“继承”如何在 C++11 标准中工作? 772 在 c++11 中“继承”构造函数时,有一个关于 using 关键字的问题。 (我想澄清一下,我知道根据标准 - 构造函数不是继承的,这就是为什么“继承”这个词用引号引起来) “继承”构造函数时 using 关键字如何工作? 此时会发生什么 - 基类的构造函数完全复制到派生类的对象中,还是类似于类之间的委托? c++ 1 个回答 Voted Best Answer AnT stands with Russia 2020-04-12T21:51:51Z2020-04-12T21:51:51Z 首先,你如此明显地远离“继承”这个词是徒劳的。标准术语称此类构造函数为“继承的”,即 “遗传”。 其次,它们完全按照标准中的描述工作:如果派生类的对象使用这样的继承构造函数进行初始化,那么继承的构造函数仅用于初始化相应的(它自己的)基子对象,其余的初始化整个对象的子对象以相同的方式完成,就像编译器生成的(“默认”)默认构造函数完成的一样。 在这种情况下,继承的构造函数保留其对基类的访问权限,而不管 using 声明在派生类中的位置。您将无法访问private基类的构造函数,也无法将protected构造函数转换为这种方式public。 因此,从实现的角度来看,每当您从具有 using 声明的基类继承构造函数时,派生类中的编译器通常必须实际生成具有相同参数集的新构造函数:因为除了初始化这个基类,派生类还需要对其其余子对象执行默认初始化,并且可能还需要做一些其他工作(正确设置指向 VMT 的指针等)
首先,你如此明显地远离“继承”这个词是徒劳的。标准术语称此类构造函数为“继承的”,即 “遗传”。
其次,它们完全按照标准中的描述工作:如果派生类的对象使用这样的继承构造函数进行初始化,那么继承的构造函数仅用于初始化相应的(它自己的)基子对象,其余的初始化整个对象的子对象以相同的方式完成,就像编译器生成的(“默认”)默认构造函数完成的一样。
在这种情况下,继承的构造函数保留其对基类的访问权限,而不管 using 声明在派生类中的位置。您将无法访问
private
基类的构造函数,也无法将protected
构造函数转换为这种方式public
。因此,从实现的角度来看,每当您从具有 using 声明的基类继承构造函数时,派生类中的编译器通常必须实际生成具有相同参数集的新构造函数:因为除了初始化这个基类,派生类还需要对其其余子对象执行默认初始化,并且可能还需要做一些其他工作(正确设置指向 VMT 的指针等)