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支持)。