我有两个类,
Base
和 Derived
。 Derived
使用其自己的成员对象构建 Base
,该成员对象继承自 Base::BaseChild
。struct Base
{
struct BaseChild
{
int x = 5;
};
Base(BaseChild& c): baseData(c), constantVar(c.x)
{
assert(constantVar == 5);
}
int getX() const {return baseData.x;}
private:
const int constantVar;
BaseChild& baseData;
};
struct Derived: public Base
{
struct DerivedChild: public BaseChild
{
double y = 4.0;
};
Derived(): Base(data) {}
private:
DerivedChild data;
};
Derived myObject;
assert(myObject.getX() == 5);
推理: 我这样做是因为在我的情况下,一切似乎都非常封装,我需要发送儿童来交换他们的内容(vector
, shared_ptr
, unique_ptr
),保留子内存地址,并且我仍然可以从基类访问Child对象而无需虚函数,这提高了我的应用程序性能。
问题: 我读过另一篇帖子 像这样一个, 其中它声明在Base
之前初始化Derived
成员是不可能的。所以constantVar
断言将始终失败。但是getX()
在构造函数之后正常工作,我对这些函数很感兴趣,它们在构造函数结束后被调用。这安全吗?还是这里有隐藏的危险?