2

观看以下示例:

class A {
public:
    A(int param1, int param2, int param3) {
        // ...
    }
};

class B : public A {
public:
    B() : m_param1(1), m_param(2), m_param(3), A(m_param1, m_param2, m_param3) {
        // ...
    }
};

B b;

显然,当 "b" 将被创建时,将在 B 的参数初始化之前调用 A 的 ctor。

这条规则阻止我创建简化类初始化的“包装”类。

这样做的“正确方法”是什么?

谢谢,阿米尔

PS:在我的特殊情况下,参数不是原语,这个例子只是帮助我解释自己。

4

3 回答 3

4

只需调用 A 的构造函数:

class B : public A
{
public:
    B() : A(1 ,2, 3)
    {
    }; // eo ctor
}; // eo class B

编辑:

只需阅读您对原始帖子的评论即可。清楚这些事情很重要:)无论如何,如果您想在 B 中创建新数据,在 B 中跟踪它并将其传递给 A,则此答案仍然适用:

class Object
{
private:
    int i;
public:
    Object(int _i) : i(_i){};
};

class A
{
public:
    A(Object* _1, Object* _2, Object* _3)
    {
    };
};

class B : public A
{
private:
    Object* _1;
    Object* _2;
    Object* _3;

public:
    B() : A(_1 = new Object(1), _2 = new Object(2), _3 = new Object(3))
    {
    };
};
于 2010-11-14T21:14:34.623 回答
2

“参数不是原语”。所以你有这样的东西吗?

class Param { /*...*/ };
class A {
public:
  A(const Param& param1, const Param& param2, const Param& param3);
};

class B : public A {
public:
  B();
private:
  Param m_param1;
  Param m_param2;
  Param m_param3;
};

并且您想将 的成员传递B给 的构造函数A。这个怎么样?

class B_params {
protected:
  B_params(int v1, int v2, int v3);
  Param m_param1;
  Param m_param2;
  Param m_param3;
};
class B : private B_params, public A {
public:
  B();
};

B_params::B_params(int v1, int v2, int v3)
  : m_param1(v1), m_param2(v2), m_param3(v3) {}
B::B() : B_params(1,2,3), A(m_param1, m_param2, m_param3) {}

只需确保B_params在的继承类A列表中出现。B

于 2010-11-14T21:28:29.933 回答
0

不确定我是否收到您的问题。

如果您只是想要一些可以帮助您使用某些给定参数初始化 A 的东西,您应该使用具有默认值的 A 构造函数:

class A {
public:
    A(int param1 = 1, int param2 = 2, int param3 =3) {
        // ...
    }
};
于 2010-11-14T21:17:18.563 回答