我有一个这样的课程:
//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;
这两个a
和b
)具有相同的m_Value
(即12)。
我知道Foo2()
会先调用Foo()
,所以m_Value
会在CONST_VARIABLE
课程中调用Foo
。因此,我尝试重新定义它,但没有运气。
由于两个类都以相同的方式初始化,但具有不同的默认值,我无法将参数添加到默认构造函数。
如何使用相同的默认构造函数创建派生类但具有不同的值?从长远来看,我可以通过快速更改值来轻松维护或修改代码。
答案 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) {}
//...
};