在派生类构造函数中初始化基类成员

时间:2016-02-20 20:14:03

标签: c++ c++11

我有2个类:A(基础)和B(派生)。我需要帮助编写B的构造函数,其中A的成员需要初始化。

class A
    private:
        std::string name;
        int a;
        int b;
        int c;
    public:
        A(std::string n) : name(n) {};
        A(std::string n, int aa, int bb, int cc) : name(n), a(aa), b(bb),                                                 
                c(cc) {};
          ...
};

class B : public A {
    private:
        int d;
        int e;
    public:
        B(std::string n, int aa, int bb, int cc,
                   int dd, int ee) : A(n, aa, bb, cc) //here comes the question
        {
            d=dd; e=ee;
        }
};

在B类的第二个构造函数中,它使用给定值aa,bb,cc初始化类A的成员;如果没有给出这些值,我希望A类获得其成员的随机数:

B(std::string n, int dd, int ee) : A(n, (rand%10)+1, (rand%10)+1,(rand%10)+1)
{
    d=dd;
    e=ee;
}

有没有更好的方法来实现它?在我的实际例子中,我在A类中有更多成员,并且使用列表初始化器语法不方便。

P.S。不确定呈现的变体是否会正常工作,因为我需要包含某个srand(time(NULL))事物...

2 个答案:

答案 0 :(得分:2)

您还可以为A实现一个(protected)构造函数,将成员初始化为随机值,然后在构造函数中为B调用它。

如果向A添加(受保护的)类(例如,将其称为RandomInit),则可以将此作为新创建的构造函数的参数,以使调用无人值守。课程本身当然是空的。

答案 1 :(得分:1)

将随机数生成移动到A的构造函数中,e。 G。通过将第一个表单扩展到A(std::string n, bool fillRandom = false)并在fillRandom == true时进行生成。 B的来电似乎是

B(std::string n, int dd, int ee) : A(n, true) 
{ ...