如何使用相同的默认构造函数创建派生类但具有不同的值?

时间:2014-11-03 19:09:50

标签: c++ inheritance scope

我有一个这样的课程:

//class1.h

class Foo
{
private:
  int m_Value;
public:
  int Foo();
}

//class1.cpp

#include "class1.h"
#define CONST_VARIABLE 12

Foo::Foo()
{
  m_Value = CONST_VARIABLE;
}

和派生类:

//class2.h

#include "class1.h"

class Foo2 : public Foo
{
puplic:
  Foo2();
  //other functions here
}

//class2.cpp

#define CONST_VARIABLE 24;
#include "class2.h"

Foo2::Foo2() : Foo()
{
}

然而,当我打电话时

Foo a;
Foo2 b;

这两个ab)具有相同的m_Value(即12)。

我知道Foo2()会先调用Foo(),所以m_Value会在CONST_VARIABLE课程中调用Foo。因此,我尝试重新定义它,但没有运气。

由于两个类都以相同的方式初始化,但具有不同的默认值,我无法将参数添加到默认构造函数。

如何使用相同的默认构造函数创建派生类但具有不同的值?从长远来看,我可以通过快速更改值来轻松维护或修改代码。

2 个答案:

答案 0 :(得分:3)

您可以使用protected构造函数,以便只有派生类可以使用指定不同成员值的构造函数:

class Foo {
public:
    Foo();
protected:
    explicit Foo(int value);
private:
    int m_Value;
};

Foo::Foo() :
    m_Value(12)
{}

Foo::Foo(int value) :
    m_Value(value)
{}

class Foo2 {
public:
    Foo2();
};

Foo2::Foo2 :
    Foo(24)
{}

答案 1 :(得分:1)

遵循您的要求,即只有默认构造函数,您可以使用模板完成此操作。假设您完全控制了您的实现:

template <int CONST_VALUE>
class FooT {
protected:
    int m_Value;
    FooT () : m_Value(CONST_VALUE) {}
};

class Foo : FooT<12> {
    //...
};

class Foo2 : FooT<24> {
    //...
};

如果Foo2必须直接从Foo继承,您可以将需要初始化的部分移动到超级父类中,然后通过Foo使用它的虚拟继承,以便Foo2可以直接初始化超级父级。这避免了需要在Foo中实现两个构造函数(一个默认值,一个让Foo2指示初始化)。

class FooBase {
protected:
    int m_Value;
    FooBase (int v) : m_Value(v) {}
};

class Foo : public virtual FooBase {
public:
    Foo () : FooBase(12) {}
    //...
};

class Foo2 : public Foo {
public:
    Foo2 () : FooBase(24) {}
    //...
};