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

How to create a derived class with same default constructor but with different value?

本文关键字:构造函数 派生 默认 何创建 一个 创建      更新时间:2023-10-16

我有一个这样的类:

//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会取Foo类中的CONST_VARIABLE。因此,我试图重新定义它,但没有成功。

由于两个类的初始化方式相同,但默认值不同,并且我无法向默认构造函数添加参数。

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

您可以使用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)
{}

遵循只有默认构造函数的要求,您可以使用模板来实现这一点。假设您完全控制您的实现:

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) {}
    //...
};