为什么编译器没有在Derived类构造函数的定义中抱怨?

时间:2011-11-13 18:30:37

标签: c++ visual-studio-2008

请注意Derived类构造函数有ii作为其第一个参数,但传递给Base的参数故意等于i

class Base
{
    protected:
    int i;

    public:
    Base(int i) : i(i) {}
};

class Derived : public Base
{
    private:
    int k;

    public:
    Derived(int ii, int k) : Base(i), k(k) {}  // Why not C2065: 'i' undeclared identifier
};

int main()
{

}

2 个答案:

答案 0 :(得分:7)

由于i是继承自Base的成员变量,因此 定义。您可以在初始化列表中自由访问成员变量,但您正在做的是在变量初始化之前访问变量,我相信,它是未定义的行为。

答案 1 :(得分:3)

因为它从基类中看到i并在初始化程序中使用它。如果您将受保护更改为私有,则会收到有关Base::i为私有的错误。