C++11继承构造函数的注意事项

4

https://en.wikipedia.org/wiki/C++11#Object_construction_improvement

对于基类构造函数,C++11允许一个类指定将继承基类构造函数。因此,C++11编译器将生成代码来执行继承和派生类到基类的转发。这是一个全有或全无的特性:要么所有该基类的构造函数被转发,要么没有被转发。此外,对于多重继承存在限制,例如不能从使用具有相同签名的构造函数的两个类中继承类构造函数。同样,派生类中不能存在与继承的基类中的签名匹配的构造函数。
可以有人给我举个例子来说明“在派生类中也不能存在与继承的基类中的签名匹配的构造函数”这个问题吗?

我修复了维基百科的文章。 - Oktalist
1个回答

6
这意味着,如果派生类中的构造函数参数列表与基类中的任何构造函数的参数列表匹配,那么该派生类的构造函数将被使用,并且会隐藏基类的构造函数。

例如:

struct Foo
{
   Foo(){std::cout << "Foo default ctor\n";}
   Foo(int){std::cout << "Foo(int)\n";}
};

struct Bar : Foo
{
   using Foo::Foo;
   Bar(int){std::cout << "Bar\n";} // won't implicitly call Foo(int)
};

int main()
{
    Bar b(1);
}

来自§12.9/3 [class.inhctor](重点在于我):

对于继承构造函数候选集中的每个非模板构造函数,除了没有参数或具有一个参数的复制/移动构造函数之外,都隐式声明了一个具有相同构造函数特征的构造函数,除非完整类中有与相同签名的用户声明构造函数出现在using-declaration处或者构造函数将作为该类的默认、复制或移动构造函数


原始代码无法编译,我进行了一些更改。代码显示它仍然可以继承Foo的构造函数。http://coliru.stacked-crooked.com/a/63e36a2c70f2d602 - q0987
@q0987:抱歉,已更新。我需要仔细查看标准才能正确处理。 - AndyG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接