基类属性的初始化不同

Iss*_* T. 7 c++ inheritance constructor

考虑具有属性的基类

class Base 
{
  protected:

  AttributeBase * elementPtr;
  ...
};
Run Code Online (Sandbox Code Playgroud)

和派生类

class Derived : public Base
{
  ...
};
Run Code Online (Sandbox Code Playgroud)

我也有一个AttributeDerived来自的课程AttributeBase

当我创建类的对象时,Base我希望elementPtr以这种方式初始化:

elementPtr = new AttributeBase()
Run Code Online (Sandbox Code Playgroud)

但是当我创建类的对象时,Derived我希望elementPtr以这种方式初始化:

elementPtr = new AttributeDerived()
Run Code Online (Sandbox Code Playgroud)

最干净的方法是什么?

Tar*_*ama 5

您可以添加一个protected构造函数Base,允许派生类传递elementPtr使用:

Base (AttributeBase* elementPtr) : elementPtr(elementPtr)
{}
Run Code Online (Sandbox Code Playgroud)

然后在派生类中,调用该构造函数:

Derived() : Base(new AttributeDerived())
{}
Run Code Online (Sandbox Code Playgroud)

如果使用C++ 11,则可以让其他Base构造函数委托给受保护的构造函数来限制代码重复.