不能使用构造函数初始化列表初始化派生类中的继承公共成员但是y构造函数正在工作

时间:2014-09-17 13:16:20

标签: c++

为什么它不起作用虽然A :: int i在B类中可见如果是这样那么为什么line1完全执行?

#include<iostream>
using namespace std;
class A{
public:
int i;
};

class B : public A{
public:
//B(int j){i=j;} //line 1

    B(int j):i(j)
    {

    }
};

int main(){
return 0;
}

2 个答案:

答案 0 :(得分:0)

class A{
public:
int i;
};

class B : public A{
public:
//B(int j){i=j;} //line 1

B(int j):i(j)   // line 2
{}
};

默认初始值设定项列表只能用于初始化当前类的成员。在这种情况下(第2行),您正在初始化基类成员。

请看下面的代码:

int a;
a = 2;
int b = 3;

a在语句中声明,并在另一个语句中赋值。然而,b被赋予一个值,而则被声明。

这正是默认初始化程序的工作原理。

class C
{
    int c;
    public:
        C() { c = 5; }
};

class D
{
    int d;
    public:
        D() : d(5) { }
};
在符号声明后为

c分配值,而d在其定义时获得值

答案 1 :(得分:0)

虽然从i可以看到B,但它不是其中一个数据成员,因此在B的初始化列表中不可用。你可以做的是给A一个构造函数并在A的初始化列表中调用B的构造函数:

#include<iostream>

using namespace std;
class A
{
public:
    int i;

    A(int i): i(i) {}
};

class B: public A
{
public:
//B(int j){i=j;} //line 1

    B(int i): A(i) {} // call A's constructor
};

int main()
{
    return 0;
}