一般情况我知道如何处理,就是用构造函数初始化表,但是这种就不行了
class c
{
public:
c(int i);
~c;
};
class b
{
public:
c m_c;
}
class a:public b
{
...........
}类a的构造函数
a::a() : m_c(1) //illegal member initialization
{
}
其中成员m_c是继承来的,不是直接在类A里面声明的,如果这样用初始化表来初始化m_c会编译报错:illegal member initialization。
那么如何在构造函数中初始化它呢:
m_c = c::c(参数);  又需要重载=符,我看很多类都不能用=符,难道我只需要简单的初始化一个类对象,非得重载=吗?而且我不知道怎么重载=符呢,是不是还要定义拷贝函数啊?

解决方案 »

  1.   

    b::b() : m_c(1)
    {}
    a::a() : b(1)
    {}
      

  2.   

    MuseIn(air supply * 学好Linux)
    b::b() : m_c(1)
    {}
    a::a() : b(1)
    {}这样处理的话m_c是在b类的构造函数中初始化的。
    如果我希望从b类继承的另外一个类,初始化m_c,参数为2,既m_c(2),那不是不行了吗?
      

  3.   

    构造函数有个特殊的初始化方式叫“初始化表达式表”(简称初始化表)。初始化表位于函数参数表之后,却在函数体 {} 之前。该表里的初始化工作发生在函数体内的任何代码被执行之前。
    构造函数初始化表的使用规则:
    如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数。
    例如
    class A
    {…
    A(int x); // A的构造函数
    };
    class B : public A
    {…
    B(int x, int y);// B的构造函数
    };
    B::B(int x, int y)
     : A(x) // 在初始化表里调用A的构造函数
    {
      …
    }