【发布时间】:2014-11-18 20:52:31
【问题描述】:
我知道这种问题已经被问过很多次了,而且我已经阅读了关于它的不同答案,以及 ISO 标准的某些部分。
但是,对于 C++ 标准所期望的确切行为,我仍然需要一些说明。
假设:
class A
{
public:
A( void ) {}
A( const A & a ) {}
};
class B: public A
{
public:
B( void ) {}
B( const B & b ) {}
};
我知道调用B 类的复制构造函数不会调用A 类的复制构造函数,并且我们可以使用初始化列表来做到这一点正确。
我也知道使用using 来继承构造函数。
但是对于没有显式提供复制构造函数而基类提供的派生类,标准究竟有什么要求:
class A
{
public:
A( void ) {}
A( const A & a ) {}
};
class B: public A
{};
一直以为编译器会为B类隐式定义一个拷贝构造函数,从而隐藏了A类的拷贝构造函数,不会被调用。
但是,看起来情况并非如此,并且调用了 A 复制构造函数。
在 OS X 10.10 上使用 Clang 编译。
那么这是强制性的,还是可以由实现定义的,这意味着我们不应该依赖这种行为?
在 C++ 标准中,我发现了以下内容,但对我来说显然不是很清楚:
一个类的继承构造函数是隐式定义的 odr-used (3.2) 创建其类类型 (1.8) 的对象。一个 隐式定义的继承构造函数执行的集合 将由用户编写的类的初始化 具有 mem-initializer-list 的该类的内联构造函数,其 只有 mem-initializer 具有命名基础的 mem-initializer-id 在使用声明的嵌套名称说明符中表示的类 和如下指定的表达式列表,其中 函数体中的复合语句为空(12.6.2)。
我真的很乐意根据标准对此进行澄清,并考虑到多重继承。
【问题讨论】:
标签: c++ inheritance constructor