C++ 基类属性的不同初始化

C++ 基类属性的不同初始化,c++,inheritance,constructor,C++,Inheritance,Constructor,考虑一个具有属性的基类 class Base { protected: AttributeBase * elementPtr; ... }; 和派生类 class Derived : public Base { ... }; 我还有一个类attributedrive,它派生自AttributeBase 当我创建类Base的对象时,我希望elementPtr以这种方式初始化: elementPtr = new AttributeBase() elementPtr = ne

考虑一个具有属性的基类

class Base 
{
  protected:

  AttributeBase * elementPtr;
  ...
};
和派生类

class Derived : public Base
{
  ...
};
我还有一个类
attributedrive
,它派生自
AttributeBase

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

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

elementPtr = new AttributeBase()
elementPtr = new AttributeDerived()

最干净的方法是什么?

您可以向
Base
添加
受保护的
构造函数,该构造函数允许派生类传递
元素ptr
以使用:

Base (AttributeBase* elementPtr) : elementPtr(elementPtr)
{}
然后在派生类中,调用该构造函数:

Derived() : Base(new AttributeDerived())
{}

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

您可以为不同的目的添加
Base
的不同构造函数:

class Base 
{
  protected:

    AttributeBase * elementPtr;
    Base(AttributeBase * p) : elementPtr(p) {}

  public:
    Base() : elementPtr(new AttributeBase) {}
};

class Derived : public Base
{
  public:
    Derived() : Base(new AttributeDerived) {}
};
然后

Base b;    // elementPtr = new AttributeBase()
Derived d; // elementPtr = new AttributeDerived()