1

我有一个要求,我想在派生类中初始化一个基类成员。

class SuperBase
{
public:
    virtual void Set();
};

class Base:public SuperBase
{
protected:
    int *pVal;
public:
    void Set()
    {
       //Some Logic
    }
};

class Derived1: public Base
{
public:
   // I want to Initialize Base::pVal here and after 
   // that I want to have this value in Set() of Base.
};

class Derived2: public Base
{
  //...Same functionality as Derived1; 
  //...
};

int main()
{
  SuperBase *s = new Derived1; 
  // Here when I create a Derived1 object automatically, 
  // the value for pVal will be initialized 
  s->Set();

 //After calling this Set, I want to get the pVal value access in Set.
}

我知道这是一件容易的事。但这些是我不能用于这个问题的东西:

  • 我不能使用 Constructor Initializer List 将值从派生类传递到 Base [我知道我可以通过 Constructor Initialiser List 轻松地做到这一点,但有一个要求我不想要现有的 Class Constructor]

  • 我曾尝试使用 CRTP [奇怪的重复模板模式],但这也不合适,因为它使用一种静态绑定,从更高的角度来看,我必须在运行时决定调用哪个类对象 Derived1、Derived2。

  • 我也不想在 Derived1,Derived2 中写任何 get(),因为我只想在那里赋值。这也是我要求的一部分。

  • 我希望 Set 逻辑只存在于 Base 类中,如果 Set 有任何特殊情况,那么我将在 Derived 类中覆盖 Set,否则我将从 Base 访问它。

有什么建议么???任何设计模式??

4

4 回答 4

3

恕我直言,你可以这样做:

选项 1:a) 覆盖 Derived1 中的 Set();

b) 在 Derived1::Set 中,
-- 分配 pVal 所需的值。

-- 调用基础::Set

示例代码:

void Derived::Set(){
    pVal = /*some value*/;

    Base::Set(); 

}

选项 2:正如 Angew 所指出的

class Derived1: public Base
{
 public:
  Derived()
  {
    pVal = /*some value*/;
  }
};

SuperBase *s = new Derived1; 调用上述构造函数pVal并将被设置。

于 2013-09-11T06:18:06.577 回答
1

您只能在该类的构造函数的成员初始化器列表中初始化该类的数据成员没有别的办法。因此,如果您需要初始化,则必须添加适当的构造函数Base并使用它(当然可以是protected)。

另一方面,如果为您的目的分配一个值就足够了pVal(在它被Base的构造函数初始化之后),您可以简单地在Derived1and的构造函数的主体中执行此操作Derived2

class Derived1: public Base
{
public:
  Derived()
  {
    pVal = whatever;
  }
};
于 2013-09-11T06:20:50.720 回答
1

为此目的创建构造函数。

class Base: public SuperBase {
public:
    Base() : pVal(0) {} // Default constructor
protected:
    int *pVal;
    Base(int* Val = 0 /* default value */) : pVal(Val) {} // special constructor
    ...
};

class Derived1: public Base {
public:
   Derived1() : Base(p1 /* Set whatever you want here */) {
   }
};

class Derived2: public Base {
public:
   Derived2() : Base(p2 /* Set other value here */) {
   }
};
于 2013-09-11T07:10:13.230 回答
0

Derived1您可以在/Derived2类和Base具有构造函数初始化的类之间添加另一层继承pVal

于 2013-09-11T06:18:08.170 回答