为了让 Dog 类的构造函数能正确地调用其父类 Animal 的构造方法,横线线处应填入( )。
class Animal {
public:
std::string name;
Animal(std::string str) : name(str) {
std::cout << "Animal created\n";
}
virtual void speak() {
std::cout << "Animal speaks" << endl;
}
};
class Dog : public Animal {
std::string breed;
public:
Dog(std::string name, std::string b) : ______________, breed(b) {
std::cout << "Dog created\n";
}
void speak() override {
std::cout << "Dog barks" << endl;
}
};
int main() {
Animal* p = new Dog("Rex", "Labrador");
p->speak();
delete p;
return 0;
}根据上下文和C++语法规则确定空缺处应填的内容,关注函数调用参数、表达式和返回值类型。
填空时注意语法完整性:分号、括号匹配、函数参数类型和个数、返回值类型。
【考点】类继承|构造函数初始化列表|C++语法规范
---
🎯 考纲定位:GESP六级C++面向对象核心考点——构造函数初始化列表。命题人专挖Java思维惯性,C++基类构造函数必须通过Base(arg)显式调用,而非super,这是六级考生最容易栽跟头的地方。
---
🧠 解题思维:Dog构造函数初始化列表需调用父类Animal构造。Animal构造函数接受std::string参数,故Animal(name)正确——按顺序把name传给基类,再把b存到成员变量。Animal::Animal(name)语法冗余(Animal::是作用域解析符,非调用方式);Animal()因Animal无默认构造且未传参必编译失败。
---
🪤 陷阱拆解:A. Animal(name)是C++标准写法,命题人以此区分Java学生;B. super(name)是Java关键字,C++无此机制,属典型跨语言混淆;C. Animal::Animal(name)看似严谨实则画蛇添足——构造函数在初始化列表中直接写类名即可,加::反而暴露语法盲区;D. Animal()是逻辑陷阱,当基类无默认构造且参数必传时,漏写参数必报错。
---
🔄 反命题思维:若Animal增加默认构造Animal(),则Animal()亦成立;若Dog参数改为std::string breed,则Animal(breed)同样正确。刷到此类题先问:基类构造参数是否匹配?调用形式是否符合C++语法?