3
我想初始化一個Derived類的成員變量,然後將其傳遞給Base類的構造函數。我想出了下面的解決方案(也在這裏:http://cpp.sh/4uu4q)在調用基類構造函數之前初始化派生類成員變量。這是UB嗎?
1)以下代碼是否有定義或未定義的行爲(UB)?
2)我試圖做一個壞設計的跡象?
struct Data {
int fValue;
Data(int value = -1) : fValue(value)
{}
};
struct Base {
Base(const std::unique_ptr<Data> & derivedData) {
std::cout << "Constructing Base derivedData=" << derivedData->fValue << std::endl;
}
};
struct Derived : public Base {
std::unique_ptr<Data> fData = std::move(fData);
Derived() : Base(ConstructData())
{}
const std::unique_ptr<Data> & ConstructData() {
fData.release();
fData.reset(new Data(777));
std::cout << "in ConstructData: fData->fValue =" << fData->fValue << std::endl;
return fData;
}
};
int main() {
Derived d;
std::cout << "In main: d.fData->fValue =" << d.fData->fValue << std::endl;
return 0;
}
2)是的,爲什麼你的基類需要知道它的構造函數中的派生類? – user463035818
派生類在構造基類之後才構造。這是UB。 –
您在構造函數被調用之前操作fData,因此它是UB。 –