关于下面 C++ 代码说法错误的是( )。 
这题考类继承与成员访问。拿到题先看 Dog 类定义里有没有 color,再看 Pet 类有没有,最后判断最后一行为什么能跑通。
学生最容易把 D 项当成正确答案,因为题目文字说 Pet 没有 color,就以为代码肯定报错。其实要记住:编译通过就说明 Dog 自己定义了 color,D 项说 Pet 没 color 是事实,但因此推断代码报错是错的。
【考点】类继承|构造函数调用链|成员访问
这题考查的是 C++ 中类的继承关系、构造函数的调用机制以及成员变量的访问范围。命题人喜欢在继承关系中设置陷阱,比如让学生误以为基类没有的成员在派生类中也无法访问,或者让学生忽略派生类自己定义的同名成员。
解题的关键在于理解代码结构:Pet 类是基类,Dog 类公有继承自 Pet。Dog 类的构造函数中通过初始化列表调用了 Pet 的构造函数,这是正确的做法。变量 dog 是 Dog 类的实例,语法没有问题。最后一行输出 dog.color 能够成功运行,说明 color 这个成员变量在 Dog 类中是存在的。因此,D 项说最后一行会报错是因为 Pet 类中没有 color,这个说法是错误的,因为 color 其实是在 Dog 类中定义的,与 Pet 类无关。
在思考过程中,我们应该先确认 Pet 类是否真的没有 color,然后看 Dog 类是否有 color。如果有,那么 D 项就是错误的。如果没有,那么 D 项就是正确的。这道题的答案就是 D,因为 Dog 类确实有 color 成员。
关于构造函数,派生类构造函数必须显式调用基类构造函数,这是 C++ 的强制要求。如果基类没有默认构造函数,派生类构造函数必须显式调用基类构造函数。如果基类有默认构造函数,派生类构造函数可以不显式调用,但调用链依然存在。
关于成员访问,派生类可以访问基类中 public 和 protected 的成员,但不能访问 private 的成员。如果派生类中定义了与基类同名的成员,那么派生类中的成员会覆盖基类中的成员,这就是所谓的"隐藏"。
在考试中,遇到这类题目,我们应该先确认代码结构,然后看是否有编译错误,最后再判断哪个选项是错误的。这道题的答案就是 D,因为 Dog 类确实有 color 成员,与 Pet 类无关。