派生クラスのメンバ変数を初期化した後、それをBaseクラスのコンストラクタに渡したいとします。次のコードが定義されていないInitialize Baseクラスのコンストラクタを呼び出す前に、派生クラスのメンバ変数を初期化します。このUBですか?
1)または未定義の動作(UB):私は(http://cpp.sh/4uu4qもここに)以下の解決策を考え出しましたか?
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です。 –