基类属性的不同初始化

Different initialization of base class attribute

本文关键字:初始化 属性 基类      更新时间:2023-10-16

考虑一个具有属性

的基类
class Base 
{
  protected:
  AttributeBase * elementPtr;
  ...
};

和派生类

class Derived : public Base
{
  ...
};

我还有一个类AttributeDerived它来自于AttributeBase

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

elementPtr = new AttributeBase()

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

elementPtr = new AttributeDerived()

最干净的方法是什么?

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

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()