总结一下现在给出的答案,再补充一点,有几个可能的解决方案。
1如果您的基类有成员的访问器,则相当简单:
DerrivedClass::DerrivedClass()
: BaseClass(new SomeParamType()),
derrivedClassMember(getBaseClassMember()),
{
...
}
2在 C++11 中,使用委托构造函数,调用您发布的原始构造函数:
DerrivedClass::DerrivedClass()
: DerrivedClass(new SomeParamType())
{}
3在 C++03 中,使用默认参数(很难看):
DerrivedClass::DerrivedClass(SomeParamType* p = new SomeParamType())
: BaseClass(p),
derrivedClassMember(p),
{
...
}
4另一种解决方法,要摆脱 C++03 中的构造函数默认参数,将使用多重继承derivedclassMember
在基类之前初始化:
struct DerivedClassInitializationWorkaround {
SomeParamType* derivedClassMember:
DerivedClassInitializationWorkaround(SomeParamType* param)
: derivedClassMember(param) {}
};
class DerivedClass : private DerivedClassInitializationWorkaround, //this has to go first!
public BaseClass {
public:
DerivedClass::DerivedClass()
: DerivedClassInitializationWorkaround(new SomeParamType())
, BaseClass(derivedClassMember)
{}
};
基类的初始化按照它们的声明顺序进行,因此如果您从 派生DerivedClassInitializationWorkaround
,derivedClassMember
它包含的 将首先初始化。
在任何情况下,您的代码都不是异常安全的。您不应将拥有指针存储为原始指针,而应使用智能指针。由于您无法更改基类,因此您必须确定它是否拥有该对象的所有权(即,它是否破坏了您传递给其构造函数的对象。
如果基类对象获得所有权,您或多或少会被现有的解决方案所困扰,除了派生类应该存储引用而不是指针,因为基类对象因此SomeParamType
对象将比派生类的对象寿命长。
如果基类没有所有权,您应该存储一个unique_ptr
:
class DerivedClass : public BaseClass {
unique_ptr<SomeParamType> derivedClassMember;
DerivedClass::DerivedClass(unique_ptr<SomeParamType> param)
: BaseClass(param.get())
, derivedClassMember(move(param))
{}
public:
DerivedClass::DerivedClass()
: DerivedClass(make_unique<SomeParamType>)
{}
};