C ++成员从派生类初始化到基类

时间:2017-07-06 00:05:03

标签: c++

让我们看看以下C ++代码。 每个继承的类都有其成员变量和初始化函数。 这些成员变量在继承的类之间是一些不同的(几乎相同的类型)。 有没有什么好的方法可以将这个初始化移动(或合并)到基类中?

class Base {
public:
   virtual init() = 0;
}
class A: public Base {
public:
   int a1;
   void init() { a1 = 0;}
}
class B: public Base {
public:
   int b1;
   void init() { b1 = 1;}
}

4 个答案:

答案 0 :(得分:4)

没有。 Base不了解A::a1B::b1。更重要的是, 不应 对其子类成员有任何了解,因为这会导致您首先尝试实现的封装的根本性崩溃。

您可以做的最好的事情是让您的Base类定义一个虚拟方法,以便在调用该方法时进行初始化和控制。每个子类都要覆盖该方法,并确保在需要初始化时根据每个子类的相应要求执行。

有一点需要注意的是,如果您的初始化旨在在每个对象的生命周期内一次性完成,那么正确的位置是按照koizyd's answer使用构造函数。

在相关的说明中,我想指出的是,你所问的是我职业生涯中最常见的OO设计缺陷之一。

使用继承代码重用而不是封装。

基本上你正在尝试将功能推入基类(以便重用),所有这一切真正实现的是使Base类变得庞大,头重脚轻且无法维护。

答案 1 :(得分:1)

在C ++中我们不能(几乎总是)创建函数init,我们使用构造函数 e.g

class Base {
};
class A : public Base {
public:
    int a1;
    A():Base(), a1(0) {}
};
class B : public Base {
public:
    int b1;
    B():Base(), b1(1){}
};

构建"孩子"是A():Base(),a1(0),它是初始化列表(:Base(),a1(0)),用于创建Base对象,int b1。 你应该在课后记得;

答案 2 :(得分:-1)

我可能会构造这样的代码:

class Base {
public:
   void init() { sub_init(); }
protected:
   virtual void sub_init() = 0;
}
class A: public Base {
public:
   int a1;
protected:
   void sub_init() { a1 = 0;}
}
class B: public Base {
public:
   int b1;
protected:
   void sub_init() { b1 = 1;}
}

做某事的替代方法(语法可能不正确......):

class Base {
public:
   virtual void init() = 0;
protected:
   void generic_init<T>(T &foo, T const &bar) { foo = bar; }
}
class A: public Base {
public:
   int a1;
   void init() { generic_init<int>(a1, 0); }
}
class B: public Base {
public:
   int b1;
   void init() { generic_init<int>(b1, 1); }
}

对我来说太可怕了!

答案 3 :(得分:-1)

也许您可以使用模板类技能来解决问题。像:

len(seq) == 1

你可以尝试一下。