Log*_*uff 5 c++ oop inheritance constructor class
我一直在寻找这个,我很惊讶我没有找到任何东西.为什么我不能使用using声明继承基类构造函数并在派生类中添加重载?我正在使用Visual C++ 2013,默认构造时会忽略基类构造函数b:
error C2512: 'B' : no appropriate default constructor available
Run Code Online (Sandbox Code Playgroud)
我通过重新定义构造函数来解决这个问题,但我不喜欢这样.这只是一个最小的例子,如果我只有一个基类构造函数,它不会打扰我.
struct A
{
A() : a(10) {}
int a;
};
struct B : A
{
using A::A;
explicit B(int a) { this->a = a; }
};
int main()
{
B b;
}
Run Code Online (Sandbox Code Playgroud)
0x4*_*2D2 10
问题是默认构造函数不是继承的.来自[class.inhctor]/p3:
对于继承的构造函数[...]的候选集中的每个非模板构造函数,构造函数是使用相同的构造函数特性隐式声明的,除非在完整的类中有一个用户声明的构造函数,其中using声明出现或者构造函数将是该类的默认,复制或移动构造函数.
您还有一个用户声明的构造函数,它禁止创建隐式默认构造函数.只需添加一个默认值即可使其工作:
B() = default;
Run Code Online (Sandbox Code Playgroud)