如何创建一个具有相同默认构造函数但具有不同值的派生类
How to create a derived class with same default constructor but with different value?
我有一个这样的类:
//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
会取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) {}
//...
};
相关文章:
- 如何委托派生类使用其父构造函数?
- 如果基类包含双指针成员,则派生类的构造函数
- C++:为什么无法在派生类中访问受保护的构造函数?
- C++派生的类构造函数
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 在没有默认构造函数的情况下创建的派生对象
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 如何在派生构造函数中多次构造基类
- C++(控制台)构造函数和派生类
- 为什么为派生类定义复制构造函数需要定义基类的默认构造函数?
- 在dynamic_pointer_cast后调用派生类的构造函数
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- 将派生类的构造函数声明为父类的友元
- 如何为具有私有成员的派生类实现移动构造函数
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 在派生自线程类的构造函数中传递字符串
- C++ 为什么要将对基类的引用传递给派生类的构造函数
- C++将派生类的const值传递给基意外行为的构造函数
- 在模板派生类中继承具有类型别名的构造函数
- 正在调用基方法,而不是从构造函数派生方法