Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么';编译器不会抱怨派生类构造函数的定义不正确吗?_C++_Visual Studio 2008 - Fatal编程技术网

C++ 为什么';编译器不会抱怨派生类构造函数的定义不正确吗?

C++ 为什么';编译器不会抱怨派生类构造函数的定义不正确吗?,c++,visual-studio-2008,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 no

请注意,
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()
{

}

因为
i
是从
Base
继承的成员变量,所以定义了。您可以在初始化器列表中自由访问成员变量,但您所做的是在初始化变量之前访问变量,我认为这是未定义的行为。

因为它从基类中看到
I
,并在初始化器中使用它。如果您将protected更改为private,您将得到一个关于
Base::i
为private的错误。

您能给出一个这样做有效的例子吗?@jaayrosa哪里有效?初始化基础成员?在这种情况下,如果
Base
没有初始化
i
的构造函数,您可能希望自己通过执行
派生(intii,intk):i(ii),k(k){}
来初始化它。但是,将未初始化的变量作为参数传递永远都是无效的。您的示例对我来说非常清楚。我不明白的是为什么编译器不发出C2065,因为传递给
Base
的变量与传递给
Derived
的变量不同@jaayrosa C2065是
未声明的标识符
。然而,
i
是完全、完全和完美地声明的,所以它不是未声明的,所以它不会发出C2065。编译器不在乎你如何使用参数,甚至根本不在乎你如何使用它们。所以你要说的是,
Derived
ctor的这个定义是有效的,它可以正常工作:
Derived(intii,intk):Base(ii),k(i){
编译器在这里肯定有足够的信息知道代码正在使用统一化变量。它没有抱怨,因为开发团队决定用他们宝贵的工时来开发其他东西,而不是这个(比如VS2010中的一些C++11支持)。