【问题标题】:Different initialization of base class attribute基类属性的不同初始化
【发布时间】:2015-08-13 08:45:48
【问题描述】:

考虑一个具有属性的基类

class Base 
{
  protected:

  AttributeBase * elementPtr;
  ...
};

还有一个派生类

class Derived : public Base
{
  ...
};

我还有一个类AttributeDerived,它派生自AttributeBase

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

elementPtr = new AttributeBase()

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

elementPtr = new AttributeDerived()

最干净的方法是什么?

【问题讨论】:

    标签: c++ inheritance constructor


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      您可以为不同的目的添加不同的Base ctors:

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

      【讨论】:

        猜你喜欢
        • 2021-11-21
        • 2017-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-05
        • 2020-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多