我有两个继承自同一个抽象超类的子类。所有子类都有一个共同的操作,它依赖于几个属性。让我用一个例子来解释:
假设这是超类A(A是抽象的):
class superClass
{
int valueA;
int valueB;
float* array;
public superClass(){
array[valueA + valueB]
}
virtual foo(){
}
}
这些是我的子类:
class firstSubClass: superClass
{
public firstSubClass():superClass(), valueA(100),valueB(2){
}
foo(){
}
}
class secondSubClass: superClass
{
public secondSubClass():superClass(), valueA(50),valueB(3){
}
foo(){
}
}
阵列是否正确初始化?转换为,是在superClass之前调用的子类构造函数,还是反过来?
有没有办法通过将它们放入superClass来使两个子类共同的初始化行为?
提前致谢。
答案 0 :(得分:4)
首先调用superClass
构造函数。
superClass
构造函数应负责初始化superClass's
数据成员
并且firstSubClass
应该初始化自己的数据成员并调用superClass's
构造函数;
有关构造函数调用顺序here的更多信息,您可能还想了解构造函数初始化列表here
所以,我会将superClass
,firstSubClass
和secondSubClass
定义为:
class superClass
{
int valueA;
int valueB;
float* array;
public:
superClass( int a , int b ): valueA(a),valueB(b) {
array = new float[valueA + valueB];
}
virtual foo(){
}
}
class firstSubClass: public superClass
{
public:
firstSubClass():superClass(100,2){ //calls superclass's constructor
}
foo(){
}
}
class secondSubClass: public superClass
{
public :
secondSubClass():superClass(50 , 3){
}
foo(){
}
}
答案 1 :(得分:1)
如果我理解得很好,你需要超类在构造任何子类时创建(不仅仅是初始化)一个浮点数组。在创建继承类的实例时,首先调用基类构造函数,然后需要将valueA和valueB值传递给它 - 您需要将它们作为构造函数参数添加:
superClass::superClass(int valueA, int valueB) :
valueA(valueA), valueB(valueB), array(0)
{
// now create an array of requested length - allocate memory for it
array = new float[valueA + valueB];
}
// don't forget to deallocate memory for it (possibly in destructor)
superClass::~superClass()
{
delete[] array;
array = 0;
}
然后,当您创建继承类的实例时,可以提供valueA和valueB作为超类构造函数的参数:
firstSubClass::firstSubClass() : superClass(100, 2)
{
//...
}
使用硬编码值(幻数)不是一个好习惯,所以最好将valueA和valueB添加为子类构造函数参数:
firstSubClass::firstSubClass(int valueA, int valueB) : superClass(valueA, valueB)
{
//...
}
最后,你应该避免使用数组。这是C ++,使用std::vector<float>
,它更安全,更容易使用!