簡體   English   中英

構造函數 inheritance 行為怪異

[英]Constructor inheritance behaving weirdly

在以下情況下:

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)提供顯式構造函數? 由於 inheritance 的原因,我猜想會推斷出默認行為。 我錯過了什么?

問題是D中的構造函數:

D(const B& b) { D(b.get()); }

這將是被調用的構造函數。 而且它不會從b復制值,而是創建一個新的臨時D object ,當構造函數 function 退出時,它會立即被破壞。

您在相應的C構造函數中遇到了同樣的問題:

C(const B& b) { C(b.get()); }

您應該使用構造函數初始值設定項列表來委托給正確的構造函數:

D(const B& b) : C(b.get()) {}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM