繼承構造可以說我有什麼我們希望成爲下一個C++標準如下代碼:C++ 0x中
int f(int x)
{
std::cout << x;
return x * x;
}
struct A
{
A(int x) : m_x(x) {}
int m_x;
};
struct B : A
{
using A::A;
B() : m_y(f(m_x)) {}
int m_y;
};
int main()
{
B(5);
}
這會調用B的默認構造函數,並打印出5,並設置m_y = 25?或者B的默認構造函數沒有運行,並且m_y未初始化?
如果是後者,不調用B默認構造函數的基本原理是什麼?很明顯,A(int)B只繼承初始化A,並使B處於不確定狀態。爲什麼C++會選擇未定義的行爲而不是簡單地調用B()的默認構造函數?它在很大程度上破壞了繼承構造函數的功能。
編輯:
或許這是應該被允許:
using A::A : m_y(...) { std::cout << "constructing..." << std::endl; ...; }
m_y將初始化,使用A :: A,你會得到像這樣的東西:B :: B(int x):A :: m_x(x){}。或者其他東西:) – hidayat 2011-03-23 10:18:36
C++實際上選擇編譯錯誤代碼,因爲您沒有爲A提供默認構造函數。它不是一個未定義的行爲:) – user396672 2011-03-23 12:43:19