[英]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();
}
main()
返回5
。 相反,它返回-2
。 似乎它正在調用A
的默認構造函數,而我本來希望它調用D(const B& b)
構造函數。 這是怎么回事?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.