构造函数继承行为异常

时间:2021-05-08 01:38:45

标签: c++ constructor

在以下情况下:

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();
}
  1. 我希望 main() 返回 5。相反,它返回 -2。似乎它正在调用 A 的默认构造函数,而我原以为它会调用 D(const B& b) 构造函数。怎么回事?
  2. 为什么我需要为 C(const B& b) 提供显式构造函数?由于继承的原因,我会猜测会推断出默认行为。我错过了什么?

1 个答案:

答案 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()) {}