在以下情况下:
class A
{
protected:
int m_int;
A() : m_int{-2} {};
public:
A(const A& a) { m_int = a.get(); }
A& operator=(const A& a) { m_int = a.get(); return *this; }
int get() const { return m_int; }
};
class B : public A
{
protected:
using A::m_int;
public:
// same constructors as parent, but public
using A::A;
};
class C : public B
{
public:
// same constructors as parent
using B::B;
C(int x) { m_int = x; }
C(const B& b) { C(b.get()); }
};
class D : public C
{
public:
// same constructors as parent
using C::C;
D(const B& b) { D(b.get()); }
};
int main()
{
C c(5);
D d(c);
return d.get();
}
main()
返回 5
。相反,它返回 -2
。似乎它正在调用 A
的默认构造函数,而我原以为它会调用 D(const B& b)
构造函数。怎么回事?C(const B& b)
提供显式构造函数?由于继承的原因,我会猜测会推断出默认行为。我错过了什么?答案 0 :(得分:4)
问题在于D
中的构造函数:
D(const B& b) { D(b.get()); }
这将是被调用的构造函数。它不会从 b
复制值,而是创建一个新的 临时 D
对象,该对象会作为构造函数立即销毁退出。
您在相应的 C
构造函数中遇到了同样的问题:
C(const B& b) { C(b.get()); }
您应该使用构造函数初始化列表来委托给正确的构造函数:
D(const B& b) : C(b.get()) {}